Позднее статическое связывание является очень важной концепцией в PHP. В этом уроке мы узнаем, что такое позднее статическое связывание и как использовать эту концепцию.
В PHP позднее статическое связывание используется для ссылки на вызываемый класс в контексте статического наследования.
Прежде чем углубиться в концепцию позднего статического связывания, давайте разберемся в разнице между self
и static
в PHP.
Разница между self
и static
в PHP
Когда мы используем ключевое слово self
в классе, оно всегда будет относиться к тому классу, в котором оно упоминается, а не к классу, который его наследует. Давайте разберемся с этой концепцией на примере:
<?php
class A {
public static function printClass() {
return self::getClassName();
}
public static function getClassName() {
return __class__;
}
}
echo A::printClass(); // A is printed
Результат выполнения вышеупомянутого сценария - вывод "А". Это то, что мы ожидали. Давайте перейдем к другому примеру.
<?php
class A {
public static function printClass() {
return self::getClassName();
}
public static function getClassName() {
return __class__;
}
}
class B extends A {
public static function getClassName() {
return __class__;
}
}
echo B::printClass(); // Still it prints A
И снова результатом выполнения этого сценария является вывод "А". Метод printClass
определен внутри класса A. Класс B расширяет класс A. Когда мы вызываем метод printClass
, область действия этого метода все еще находится внутри класса A.
ПРИМЕЧАНИЕ: ключевое слово self
в PHP относится к классу, в котором оно находится, и не обязательно к классу, его расширяющему.
Позднее статическое связывание в PHP
Чтобы решить эту проблему, на помощь приходит концепция позднего статического связывания. Давайте использовать ключевое слово static
вместо self
.
<?php
class A {
public static function printClass() {
return static::getClassName();
}
public static function getClassName() {
return __class__;
}
}
class B extends A {
public static function getClassName() {
return __class__;
}
}
echo B::printClass(); // Prints B
echo A::printClass(); // Prints A
Когда мы используем ключевое слово static
, мы ссылаемся на класс, который вызывается во время выполнения.
Само название "позднее статическое связывание" отражает в себе внутреннюю реализацию этой особенности. "Позднее связывание" отражает тот факт, что обращения через
static::
не будут вычисляться по отношению к классу, в котором вызываемый метод определен, а будут вычисляться на основе информации в ходе исполнения. Также эта особенность была названа "статическое связывание" потому, что она может быть использована (но не обязательно) в статических методах.Руководство php.net
Перевел scorp13
Статья является свободным переводом материала сайта https://webrewrite.com/