Статическое свойство php

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

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

Фрагмент 1

 class base { public static $var = 1; } class sub extends base { public static $var = 2; } echo base::$var; // Outputs 1 

1

Фрагмент 2

 class base2 { public static $var2 = 1; } class sub2 extends base2 { } sub2::$var2 = 2; echo base2::$var2; // Outputs 2 

2

Solutions Collecting From Web of "Статическое свойство php"

Я хотел бы добавить еще один момент.

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

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

Винод

Public static variable действует как global переменная.

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

Посмотрите на наследование статической переменной .

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

В первом коде вы переопределили это в расширенном классе. У переменной есть область внутри своих классов.

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

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

В Snippet 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; // Outputs 1