Защищенные статические переменные-члены

Я недавно работал над некоторыми файлами классов, и я заметил, что переменные-члены были установлены в защищенном статическом режиме, таком как защищенный static $ _someVar, и доступ к нему как static :: $ _ someVar.

Я понимаю концепцию видимости и что наличие чего-то установленного в качестве защищенного static обеспечит доступ к переменной-члену только в суперклассическом или производном классах, но могу ли я получить доступ к защищенным статическим переменным только в статических методах?

благодаря

Solutions Collecting From Web of "Защищенные статические переменные-члены"

Если я правильно понимаю, то, о чем вы говорите, называется поздним статическим привязкой . Если у вас есть это:

class A { static protected $_foo = 'bar'; static public function test() { echo self::$_foo; } } class B extends A { static protected $_foo = 'baz'; } B::test(); // outputs 'bar' 

Если вы измените self бит:

 echo static::$_foo; 

Затем выполните:

 B::test(); // outputs 'baz' 

Поскольку self относится к классу, где $_foo был определен (A), а static ссылается на класс, который вызвал его во время выполнения (B).

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

Статические переменные существуют в классе, а не в экземплярах класса. Вы можете получить к ним доступ из нестатических методов, вызывая им что-то вроде:

 self::$_someVar 

Причина этого заключается в том, что self является ссылкой на текущий класс, а не на текущий экземпляр (например, $this ).

В качестве демонстрации:

 <? class A { protected static $foo = "bar"; public function bar() { echo self::$foo; } } class B extends A { } $a = new A(); $a->bar(); $b = new B(); $b->bar(); ?> 

Выходной barbar является barbar . Однако, если вы попытаетесь получить к нему доступ напрямую:

 echo A::$foo; 

Тогда PHP будет правильно жаловаться на вас за попытку доступа к защищенному члену.