Позднее статическое связывание
Позднее статическое связывание
Позднее статическое связывание может быть использовано чтобы получить ссылку на вызываемый класс в контексте статического наследования
Перенаправленный вызов - это вызов, который начинается с self::, parent::, static::, или, если двигаться вверх по иерархии классов, forward_static_call()
Функция get_called_class() может быть использована для получения строки с именем вызванного класса, а static:: представляет её область действия
Если говорить более точно, позднее статическое связывание сохраняет имя класса указанного в последнем "неперенаправленном вызове"
Также эта особенность была названа "статическое связывание" потому, что она может быть использована (но не обязательно) в статических методах
Статические ссылки на текущий класс, такие как self:: или __CLASS__, вычисляются используя класс, к которому эта функция принадлежит, как и в том месте, где она была определена:
class A
{
public static function who() {
echo __CLASS__ . "<br>";
}
public static function test() {
self::who();
}
}
class B extends A
{
public static function who() {
echo __CLASS__ . "<br>";
}
}
$class1 = new A;
$class2 = new B;
A::who(); #A
B::who(); #B
A::test(); #A
B::test(); #A
Позднее статическое связывание пытается устранить это ограничение, предоставляя ключевое слово, которое ссылается на класс, вызванный непосредственно в ходе выполнения. Попросту говоря, ключевое слово, которое позволит вам ссылаться на B из test() в предыдущем примере. Было решено не вводить новое ключевое слово, а использовать static, которое уже зарезервировано
class A
{
public static function who() {
echo __CLASS__ . "<br>";
}
public static function test() {
static::who(); // Здесь действует позднее статическое связывание
}
}
class B extends A
{
public static function who() {
echo __CLASS__ . "<br>";
}
}
$class1 = new A;
$class2 = new B;
A::who(); #A
B::who(); #B
A::test(); #A
B::test(); #B
В нестатическом контексте вызванным классом будет тот, к которому относится экземпляр объекта. Поскольку $this-> будет пытаться вызывать закрытые методы из той же области действия, использование static:: может дать разные результаты. Другое отличие в том, что static:: может ссылаться только на статические поля класса
#3 Использование static:: в нестатическом контексте
class A
{
public function who() {
echo __CLASS__ . "<br>";
}
public function test() {
$this->who();
static::who();
}
}
class B extends A
{
public function who() {
echo __CLASS__ . "<br>";
}
}
$class1 = new A;
$class2 = new B;
var_dump($class1);
echo "<br>";
var_dump($class2);
echo "<br>";
$class1->who(); #A
$class2->who(); #B
$class1->test(); #AA
$class2->test(); #BB
Источники
Связанные темы
Оператор разрешения видимости в php
Методы создания экземпляра класса в php
Автоматическая загрузка классов
Наследование с помощью extends в php
Конструкторы и деструкторы в php