PHP :: Позднее статическое связывание
В PHP статические ссылки на текущий класс, такие как self::, вычисляются исходя из области видимости того класса, в котором они были определены, а не вызваны. Поэтому при наследовании методов с такими ссылками может возникнуть ситуация, когда нужно будет использовать область видимости класса-потомка, вызывающего данный метод, а не область видимости родительского класса. Для таких случаев предусмотрена возможность позднего статического связывания, заключающаяся в использовании вместо конструкции self:: специальной конструкции static::, которая отслеживает и ссылается на текущую область видимости (см. пример №1).
<?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
- Вернуться к оглавлению учебника