Этот вопрос проверяет понимание тонкостей наследования статических методов в PHP и знание ключевого слова static.
Позднее статическое связывание (PSB) применяется, когда нужно, чтобы статический метод в родительском классе ссылался на класс, в котором он был вызван, а не на класс, в котором он объявлен. Это решает проблему "раннего" связывания, когда ключевое слово self всегда указывает на класс, где оно написано. PSB используется для реализации паттерна "Активные записи" (Active Record), фабричных методов и в любом месте, где логика в родительском классе зависит от класса-потомка.
Позднее статическое связывание (Late Static Binding) — это механизм, который позволяет ссылаться на вызываемый класс в контексте статического наследования.
Без PSB ключевое слово self всегда привязано к классу, в котором оно объявлено.
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
self::who(); // Всегда ссылается на A
}
}
class B extends A {
public static function who() {
echo __CLASS__;
}
}
B::test(); // Выведет 'A', хотя мы вызвали метод у класса B.static:Ключевое слово static ссылается на класс, в котором метод был вызван.
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
static::who(); // Ссылается на класс, в котором вызван
}
}
class B extends A {
public static function who() {
echo __CLASS__;
}
}
B::test(); // Выведет 'B', что и является ожидаемым поведением.Паттерн Active Record / ORM:
Родительский класс Model может иметь метод find(), который должен возвращать экземпляр не Model, а конкретного класса-потомка (User, Product).
class Model {
public static function find($id) {
// ... логика поиска в БД ...
return new static($data); // Создает объект того класса, у которого был вызван метод
}
}
class User extends Model {}
$user = User::find(1); // Вернет объект класса User, а не Model.Фабричные методы (Factory Method):
Создание объектов, тип которых зависит от класса-потомка.
Реализация шаблона Singleton для иерархии классов.
Вывод: PSB стоит применять в родительских классах, когда их статическая логика должна быть полиморфной и зависеть от конкретного класса-потомка, который ее вызывает. Это ключевой инструмент для создания гибких и расширяемых библиотек и ORM.