Начиная с PHP 5.3.0, в PHP реализована функция, называемая поздним статическим связыванием, которая может использоваться для ссылки на вызываемый класс в контексте статического наследования.
Позднее статическое связывание пытается устранить это ограничение, вводя ключевое слово, которое ссылается на класс, который был первоначально вызван во время выполнения. Было решено не вводить новое ключевое слово, а использовать static
, который уже был зарезервирован.
Давайте рассмотрим пример:
<?php
class Car
{
public static function run()
{
return static::getName();
}
private static function getName()
{
return 'Car';
}
}
class Toyota extends Car
{
public static function getName()
{
return 'Toyota';
}
}
echo Car::run(); // Output: Car
echo Toyota::run(); // Output: Toyota
?>
late static bindings
работает путем сохранения класса, названного в последнем "вызове без переадресации". В случае статических вызовов методов это класс с явным именем (обычно слева от оператора ::); в случае нестатических вызовов методов это класс объекта.
«Переадресация вызова» - это статический вызов, который вводится self::
, parent::
, static::
или, если поднимется в иерархии классов, forward_static_call()
.
Функция get_called_class()
может использоваться для извлечения строки с именем вызываемого класса, а static::
вводит ее область действия.