Позднее статическое связывание в PHP
Рассмотрим следующий пример:
<?php
class A
{
// защищенное статическое свойство содержит имя класса
protected static $name = "My name A!";
// просто возвращает имя класса, причем ключевое слово self
// будет возвращать свойство $name из того места, где эта
// переменная определена изначально
public static function getName() {
return self::$name;
}
// эта функция тоже возвращает свойство $name
// но уже не из родительского, а из дочерних классов
public static function getNameSB() {
// ключевое слово static
return static::$name;
}
}
// класс B наследует свойства и методы класса A
// но у себя он переопределяет свойство $name
class B extends A {
protected static $name = "My name B!";
}
print A::getName() . PHP_EOL;
print B::getName() . PHP_EOL;
print A::getNameSB() . PHP_EOL;
print B::getNameSB() . PHP_EOL;
Результат выполнения:
C:\> php php-late-static-binding.php
My name A!
My name A!
My name A!
My name B!
Теперь давайте посмотрим, почему у нас именно такой результат. При первом вызове A::getName() возвращает нам "My name A!", что логично. Вызов B::getName() возвращает тоже самое, хотя мы не этого ожидали. Посмотрим что происходит дальше. Вызов A::getNameSB() возвращает опять тоже значение - и это тоже логично. Но вызов B::getNameSB() возвращает уже "My name B!". Это как раз то, что нам нужно.
Так что же здесь происходит? А вот что: когда мы в методе getNameSB() класса А определяем return static::$name мы говорим компилятору PHP, что нам нужно значение из контекста дочернего класса, а не из контекста родительского. Проще говоря, свойство берется не из того места где оно определено изначально, а из того места где оно переопределено, т.е. из дочернего класса. Вот это как раз и называется поздним статическим связыванием в PHP.
Таким образом, если Вам надо получить статические свойства (методы) из родительского класса для дочернего класса Вам необходимо использовать позднее статическое связывание в PHP, реализуемое посредством ключевого слова static.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.