PHP :: Позднее статическое связывание
В PHP статические ссылки на текущий класс, такие как self::, вычисляются исходя из области видимости того класса, в котором они были определены, а не вызваны. Поэтому при наследовании методов с такими ссылками может возникнуть ситуация, когда нужно будет использовать область видимости класса-потомка, вызывающего данный метод, а не область видимости родительского класса. Для таких случаев предусмотрена возможность позднего статического связывания, заключающаяся в использовании вместо конструкции self:: специальной конструкции static::, которая отслеживает и ссылается на текущую область видимости (см. пример №1).
htmlCodes
<?php
class A{
public static function my_func_1(){
echo 'Класс А'.'<br>';
}
public static function my_func_2(){
self::my_func_1();
}
}
class B extends A {
//Переопределяем метод
public static function my_func_1(){
echo 'Класс B'.'<br>';
}
}
//Выведет 'Класс А', т.к. функция my_func_2 использует
//статическую ссылку self::, которая использует область видимости
//того класса, в котором она была определена, а не используется
B::my_func_2();
//Используем позднее статическое связывание
class C{
public static function my_func_1(){
echo 'Класс C';
}
public static function my_func_2(){
static::my_func_1();
}
}
class D extends C {
//Переопределяем метод
public static function my_func_1(){
echo 'Класс D';
}
}
//Выведет 'Класс D', т.к. функция my_func_2 использует позднее
//статическое связывание при помощи ссылки static::, которая использует
//область видимости класса, в котором она используется, а не определена
D::my_func_2();
?>
Пример №1. Использование позднего статического связывания
Конструкция static::, использующаяся для позднего статического связывания, предназначена для ссылки на статические поля (т.е. свойства и методы) класса. Поэтому, во избежание получения результатов отличных от ожидаемых, не следует использовать ее в нестатическом контексте.
Быстрый переход к другим страницам
- Перегрузка в PHP
- Позднее статическое связывание в PHP
- Пространства имен в PHP
- Вернуться к оглавлению учебника