С выходом 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
Свежие комментарии