Выбрать страницу

С выходом PHP версии 5.3 в нашем распоряжении появилось еще одно ключевое слово: static. Точнее, появилось возможность его использовать в контексте определения реализации методов класса.

Но, пойдем по порядку. Мы имеем три ключевых слова используемых в реализациях методов класса:

parent
Получить доступ к переопределенному методу класса, доступ к суперклассу без использования имени класса.
self
Получить доступ к текущему классу. Чтобы получить доступ к текущему объекту используется псевдопеременая $this.
static
Используется для позднего статического связывания. Аналогично ключевому слову self, за исключение того, что относиться к вызывающему классу, а не содержащему.

Давайте рассмотрим простой пример:

class MainClass {
	public function GetName(){
		echo "Main\n";
	}
	public function PrintSelf(){
		echo "PrintSelf: ";
		self::GetName();
	}
	public function PrintStatic(){
		echo "PrintStatic: ";
		static::GetName();
	}
	public function PrintParent(){
		echo "PrintParent: ";
		parent::GetName();
	}

}
class SecondClass extends MainClass{
	public function GetName(){
		echo "Second\n";
	}
	public function PrintParent2(){
		echo "PrintParent2: ";
		parent::GetName();
	}
}
$x=new SecondClass();
$x->PrintSelf(); //Вывод: PrintSelf: Main
$x->PrintStatic(); //Вывод: PrintStatic: Second
$x->PrintParent(); //Ошибка "Fatal error: Cannot access parent:: when current class scope has no parent"
$x->PrintParent2(); //Вывод: PrintParent2: Main

В классе MainClass мы определили метод GetName, который затем переопределили в классе SecondClass. Также в классе MainClass мы определили еще три метода вызывающие метод GetName. Что же у нас получилось?
PrintSelf вызвал метод из класса MainClass несмотря на то, что объект имеет класс SecondClass. То есть ключевое слово self указывает на класс в котором было произведено определение метода. Ключевое слово parent ведет себя также, оно указывает на класс в котором было произведено определение метода. А вот ключевое слово static указывает на класс в контексте которого происходил вызов метода. Это и называется: позднее статическое связывание.

Было опубликовано 27 марта 2013 на php-example.ru

Share This