Статическое свойство 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