Sobes.tech
Middle+

Cos'è il binding statico tardivo in PHP?

sobes.tech AI

Risposta dell'AI

Questo meccanismo consente di fare riferimento alla classe chiamata nel contesto delle chiamate statiche. Risolve il problema delle auto-riferimenti nelle classi ereditarie quando si utilizza la parola chiave static::.

Consideriamo un esempio con self:::

<?php
class A {
    public static function who() {
        echo __CLASS__; // Stampa A
    }
    public static function test() {
        self::who(); // Chiama A::who()
    }
}
class B extends A {
    public static function who() {
        echo __CLASS__; // Stampa B
    }
}

B::test(); // Stampa A

In questo caso, self::who() all'interno della classe A chiamerà sempre il metodo who della classe A, anche se la chiamata a test() proviene dalla classe B.

Ora vediamo un esempio con static:::

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // Chiamerà who() della classe che ha avviato la chiamata a test()
    }
}
class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test(); // Stampa B

Qui, static::who() all'interno della classe A chiamato dalla classe B si riferirà alla classe B e chiamerà il metodo who() della classe B.

Il binding statico tardivo permette di determinare dinamicamente quale classe usare nel contesto di una chiamata statica, a seconda della classe effettivamente chiamata. Questo è particolarmente utile quando si lavora con gerarchie di classi e metodi statici che devono comportarsi in modo polimorfico. Funziona ricordando la "classe chiamata non reindirizzata" (l'ultima classe nella catena di ereditarietà da cui è iniziata la chiamata statica) e utilizzandola per risolvere i riferimenti static::.