Рубрики
Uncategorized

Подробное объяснение поздних операций статической привязки классов и объектов PHP

Автор оригинала: David Wong.

Эта статья иллюстрирует операцию статической привязки между классами PHP и объектами на более поздней стадии. Поделитесь для вашей справки следующим образом:

Статическая привязка очень полезна для более поздних проектов. Например, режим одноэлементного уровня сервиса очень хорошо реализован с поздней статической привязкой.

Начиная с PHP 5.3.0, PHP добавил функцию, называемую постстатической привязкой, для ссылки на классы, которые статически вызываются в рамках наследования.

Чтобы быть точным, поздняя статическая привязка работает, сохраняя имя класса последнего “не переадресованного вызова”. При вызове статического метода имя класса является явно указанным (обычно в левой части оператора); при вызове нестатического метода это класс, к которому принадлежит объект. Так называемый вызов переадресации относится к статическим вызовам, выполняемым следующими способами: self:: , parent:: , static:: , а также forward_static_call() . доступна get_called_class() Функция для получения имени класса вызываемого метода, static:: указывает его область действия.

С лингвистической точки зрения эта функция называется “Поздняя статическая привязка”. “Поздняя привязка” означает, что static:: Вместо того, чтобы быть разрешенным для определения класса, в котором находится текущий метод, он вычисляется во время выполнения. Его также можно назвать “статической привязкой”, поскольку его можно использовать для (но не ограничиваясь) вызовами статических методов.

php
class A {
  public static function who() {
    echo __CLASS__;
  }
  public static function test() {
    Static:: who (); // Late Static Binding starts here
  }
}
class B extends A {
  public static function who() {
    echo __CLASS__;
  }
}
B::test();
?>

Приведенная выше процедура выведет:

B

Примечание:

В нестатической среде вызываемый класс-это класс, к которому принадлежит экземпляр объекта. Поскольку $this – > пытается вызвать частные методы в рамках одной и той же области действия, static:: может давать разные результаты. Другое отличие заключается в статичности:: Его можно использовать только для статических атрибутов.

Пример № 3 Используйте статику::

foo();
    static::foo();
  }
}
class B extends A {
  /* foo() will be copied to B, hence its scope will still be A and
  * the call be successful */
}
class C extends A {
  private function foo() {
    /* original method is replaced; the scope of the new one is C */
  }
}
$b = new B();
$b->test();
$c = new C();
$c->test();  //fails
?>

Приведенная выше процедура выведет:

успех! успех! успех! Фатальная ошибка: Вызов частного метода C::foo() из контекста ” A ” в/tmp/test.php на линии 7

Примечание:

Разрешение поздней статической привязки будет продолжаться до тех пор, пока не будет получен полностью разрешенный статический вызов. С другой стороны, если используется статический вызов parent:: возможно, self:: Информация о вызове будет передана.

Пример № 4 Переадресация и Не Переадресация вызовов



Приведенная выше процедура выведет:

A C C

Больше читателей, интересующихся контентом, связанным с PHP, могут ознакомиться с темами этого сайта: Введение в объектно-ориентированное программирование Php, Введение в навыки работы с массивами PHP, Введение в базовую грамматику PHP, Краткое описание работы с PHP и использования операторов, Краткое описание использования строк Php, Введение в работу с базой данных php+mysql и Общие операции с базами данных php. Краткое изложение навыков письма ___________

Я надеюсь, что эта статья будет полезна для разработки PHP – программ для всех.