Sobes.tech
Middle+

Какво е късното статично свързване в 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:: връзки.