У меня есть два фрагмента кода (относительно 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
Я хотел бы добавить еще один момент.
Переменная 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