Защищенные статические переменные-члены
Недавно я работал над некоторыми файлами классов, и я заметил, что переменные-члены были установлены в защищенном статическом режиме, таком как защищенный static $_someVar, и получили доступ к нему как static:: $_ someVar.
Я понимаю концепцию видимости и что наличие чего-либо, установленного как защищенный static, гарантирует, что переменная-член может быть доступна только в суперклассическом или производном классах, но могу ли я получить доступ к защищенным статическим переменным только в статических методах?
Спасибо
Ответы
Ответ 1
Если я правильно понимаю, то, о чем вы говорите, называется поздними статическими привязками. Если у вас есть это:
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;
Тогда do:
B::test(); // outputs 'baz'
Потому что self
относится к классу, где $_foo
был определен (A), а static
ссылается на класс, который вызвал его во время выполнения (B).
И, конечно же, да, вы можете получить доступ к статическим защищенным членам вне статического метода (т.е.: контекст объекта), хотя видимость и область действия все еще имеют значение.
Ответ 2
Статические переменные существуют в классе, а не в экземплярах класса. Вы можете получить к ним доступ из нестатических методов, вызывая их что-то вроде:
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
. Однако, если вы попытаетесь получить к нему доступ напрямую:
echo A::$foo;
Затем PHP будет правильно жаловаться на вас за попытку доступа к защищенному члену.