#php #static
Почему $c вычислится в 2? Что происходит? Мы создаём класс Альфа, затем создаём Бета, который её наследует. Альфа задаёт статичное свойство. Здесь $a - инкрементирует $valA, т.к. через перезагрузку мы обращаемся к родителю - Альфе. $b - инкрементирует $valB, т.к. мы обращаемся к свойству класса. $c - тоже обращается к родителю, но почему то вычисляется в 2. $d - равнозначно случаю с $b. Где ошибка в ходе мыслей и как работает на самом деле? class Alfa { public static $valA = 0; } class Beta extends Alfa { public $valB = 0; } $beta1 = new Beta(); $a = ++$beta1::$valA; $b = ++$beta1->valB; $beta2 = new Beta(); $c = ++$beta2::$valA; $d = ++$beta2->valB;
Ответы
Ответ 1
Статическое свойство класса одно для всех объектов данного класса и его потомков(если не было принудительно переопределено). Можно считать его глобальным состоянием в области видимости класса. class A{ public static $a = 1; } class B extends A{}; class C extends A{ public static $a = 100; }; $a = new A(); $b = new B(); $c = new C(); printf(' %7s%7s%7s'.PHP_EOL, 'A::$a', 'B::$a', 'C::$a'); printf('initial %7d%7d%7d'.PHP_EOL, A::$a, B::$a, C::$a); $a::$a++; printf('$a::$a++ %7d%7d%7d'.PHP_EOL, A::$a, B::$a, C::$a); $b::$a++; printf('$b::$a++ %7d%7d%7d'.PHP_EOL, A::$a, B::$a, C::$a); $c::$a++; printf('$c::$a++ %7d%7d%7d'.PHP_EOL, A::$a, B::$a, C::$a); Вывод A::$a B::$a C::$a initial 1 1 100 $a::$a++ 2 2 100 $b::$a++ 3 3 100 $c::$a++ 3 3 101 sandboxОтвет 2
Попробую дать ответ на этот вопрос, таким образом как я это понимаю. Когда мы создаем класс Alfa, мы объявляем статическое свойство $valA. Иными словами, это означает что свойство принадлежит именно классу Alfa, но никак не объекту класса Alfa. Мы ведь не можем обратится к этому свойству следующим образом `$beta->valA. Cоответственно, каждый раз инрементируя свойство $valA мы инкрементируем статическое свойство класса, но никак не свойство созданного нами нового объекта
Комментариев нет:
Отправить комментарий