Web

PHP – статические свойства

У меня есть два фрагмента кода, которые, как я ожидаю, будут иметь одинаковый результат, но на самом деле результаты разные.

Вопрос в том, почему?

 

Фрагмент 1

class base {

    public static $var = 1;

}

 class sub extends base {

    public static $var = 2;

}

 echo base::$var; // Выводит 1

 

Фрагмент 2

class base2 {

    public static $var2 = 1;

}

 class sub2 extends base2 {

}

 sub2::$var2 = 2;

echo base2::$var2; // Выводит 2

 

Ответ 1

Переменные STATIC не связаны с каким-либо конкретным экземпляром/объектом класса. Следовательно, если вы изменяете переменную по ссылке родительского класса или по ссылке дочернего класса, изменяется одна и та же переменная.

Следовательно, надо понимать, что свойства Public Static, как и глобальные, не связаны с конкретным экземпляром объекта, поэтому по любой ссылке на иерархию класса вы обновляете статическую переменную и обновляется одна и та же область памяти.

 

Ответ 2

Публичная статическая переменная действует подобно глобальной переменной.

Поскольку область видимости публичной статической переменной определяется глобально, можно гарантировать, что любые изменения глобальной переменной будут видны во всей программе. Эту концепцию вы можете проанализировать в вашем примере программы.....

 

Ответ 3

Если вы передаете статическую переменную подклассу, то эта переменная является общей (она всегда имеет одно и то же значение в обоих классах). Если вы перегружаете статическую переменную в подклассе, то это новая статическая переменная, не зависящая от статической переменной родителя.

В фрагменте 1 base::var и sub::var имеют разное распределение памяти, потому что вы перегрузили $var = 2; в классе sub.

В фрагменте 2 base::var и sub::var имеют одинаковое распределение памяти, потому что вы не указали $var2 в классе sub2.

Поэтому base:var не изменяется. Он также не изменится, если вы позже измените $var из класса sub следующим образом: 

class base {

    public static $var = 1;

}

 class sub extends base {

    public static $var = 2;

}

sub::var = 3;

echo base::var; // Выводится 1

 

Ответ 4

Поскольку класс sub2 не имеет var2, он принимает значение класса base2. Поэтому, когда вы присвоили новое значение, используя этот sub2::$var2 = 2; оно изменилось на новое значение.

В первом коде вы переопределили ее в своем расширенном классе. Обе переменные имеют область видимости, в соответствии с тем, где они определены в иерархии наследования.

Схожие статьи

Как поднять свой VPN сервер: пошаговая инструкция с картинками
Web

Как поднять свой VPN сервер: пошаговая инструкция с картинками

Web

Как я могу узнать часовой пояс локального сервера?

Web

Как получить первый элемент массива в PHP

Web

Как и где устанавливается $ _SERVER ['APP_DEBUG'] в Symfony >= 5.1?