Какво е късното статично свързване в PHP?
sobes.tech AI
Отговор от AI
Този механизъм позволява да се позовава на извикания клас в контекста на статични извиквания. Той решава проблема с авто-референциите в наследяващите класове при използване на ключовата дума static::.
Нека разгледаме пример с използване на self:::
<?php
class A {
public static function who() {
echo __CLASS__; // Ще изведе A
}
public static function test() {
self::who(); // Ще извика A::who()
}
}
class B extends A {
public static function who() {
echo __CLASS__; // Ще изведе B
}
}
B::test(); // Ще изведе A
В този случай, self::who() в класа A винаги ще извика метода who от класа A, дори ако извикването на test() идва от класа B.
Сега да разгледаме пример с static:::
<?php
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
static::who(); // Ще извика who() от класа, който е инициатор на извикването на test()
}
}
class B extends A {
public static function who() {
echo __CLASS__;
}
}
B::test(); // Ще изведе B
Тук, static::who() в класа A при извикване от класа B ще се отнася към класа B и ще извика метода who() от класа B.
Късното статично свързване позволява да се определя динамично коя класа да се използва в контекста на статично извикване, в зависимост от това коя класа е била действително извикана. Това става особено полезно при работа с йерархии от класове и статични методи, които трябва да се държат полиморфно. Работи чрез запаметяване на "непренасочения извикан клас" (крайната класа в веригата на наследяване, от която е започнало статичното извикване) и използването й за разрешаване на static:: връзки.