Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Двойное двоеточие (::) Почему это так вычисляется?

#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 мы инкрементируем статическое свойство класса, но никак не свойство созданного нами нового объекта

Комментариев нет:

Отправить комментарий