Пізніше статичне зв'язування
PHP реалізує функцію, звану пізніше статичне зв'язування, яка може бути використана для того, щоб отримати посилання на клас, що викликається в контексті статичного успадкування.
Якщо точніше говорити, пізніше статичне зв'язування зберігає ім'я класу вказаного в останньому "неперенаправленому виклику". У разі статичних викликів це явно вказаний клас (зазвичай ліворуч від оператора ::
); у разі нестатичних викликів це клас об'єкта. "Переспрямований виклик" - це статичний виклик, що починається з self::
parent::
static::
, або, якщо рухатися вгору по ієрархії класів, forward_static_call()Функцияget_called_class() може бути використана для отримання рядка з ім'ям викликаного класу, а static::
представляє її сферу дії.
Сама назва "пізнє статичне зв'язування" відображає в собі внутрішню реалізацію цієї особливості. "Пізнє зв'язування" відображає той факт, що звернення через static::
не будуть обчислюватися по відношенню до класу, в якому метод, що викликається, визначений, а будуть обчислюватися на основі інформації в ході виконання. Також ця особливість була названа "статичне зв'язування" тому, що вона може бути використана (але не обов'язково) у статичних методах.
Ограниченияself::
Статичні посилання на поточний клас, такі як self::
или__CLASS__
, обчислюються використовуючи клас, якого ця функція належить, як у тому місці, де було визначено:
Приклад #1 Использованиеself::
Loading...
Результат виконання наведеного прикладу:
A
Використання пізнього статичного зв'язування
Пізніше статичне зв'язування намагається усунути це обмеження, надаючи ключове слово, яке посилається клас, викликаний безпосередньо під час виконання. Простіше кажучи, ключове слово, яке дозволить вам посилатися на B
изtest()
у попередньому прикладі. Вирішили не вводити нове ключове слово, а використовувати static
, яка вже зарезервована.
Приклад #2 Простое использованиеstatic::
Loading...
Результат виконання наведеного прикладу:
B
Зауваження :
У нестатичному контексті викликаним класом буде той, до якого належить екземпляр об'єкта. Оскільки
$this->
буде намагатися викликати закриті методи з тієї ж області дії, використанняstatic::
може дати різні результати. Інша відмінність у тому, щоstatic::
може посилатися лише на статичні поля класу.
Приклад #3 Использованиеstatic::
у нестатичному контексті
Loading...
Результат виконання наведеного прикладу:
success!
success!
success!
Fatal error: Call to private method C::foo() from context 'A' in /tmp/test.php on line 9
Зауваження :
Дозволяюча область пізнього статичного зв'язування буде фіксована статичним викликом, що обчислює її. З іншого боку, статичні виклики з використанням таких директив як
parent::
илиself::
перенаправляють інформацію дзвінка.Приклад #4 Перенаправлені та неперенаправлені дзвінки
Loading...Результат виконання наведеного прикладу:
A C C