Защищенные статические переменные-члены - PullRequest
12 голосов
/ 25 ноября 2010

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

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

Спасибо

Ответы [ 2 ]

36 голосов
/ 26 ноября 2010

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

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).

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

7 голосов
/ 25 ноября 2010

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

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 будет правильно жаловаться на вас за попытку доступа к защищенному участнику.

...