html.okpython.net
HTML и CSS для начинающих

PHP :: Позднее статическое связывание

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

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

Быстрый переход к другим страницам