Вернуться




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; оно изменилось на новое значение.

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



Если вам понравилась эта статья поделитесь ею с друзьями, тем самым вы помогаете нам развиваться и добавлять всё больше интересного и полезного контента!




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





Какой хостинг выбрать для сайта

Какой хостинг выбрать для сайта

Для беспроблемного функционирования сайта на просторах интернета необходимо ...

15 Февраля 2021    Web

Как и на чём лучше писать сайты?

Как и на чём лучше писать сайты?

Каждый начинающий сайтостроитель мечтает создать свой уникальный сайт на ко ...

21 Февраля 2021    Web

Ищем качественный и недорогой хостинг? Тогда вам сюда

Ищем качественный и недорогой хостинг? Тогда вам сюда

Рано или поздно всем вебмастерам приходится искать хостинг для своего проек ...

21 Февраля 2021    Web