Le principe du Late Static Bindings est simple : lors de l'appel statique d'une propriété sur un objet (qu'il s'agisse d'un attribut ou d'une méthode) le moteur ne résoudra pas les noms en se basant sur ce qui à été défini par vos classe, mais avec les informations une fois compilés.
Prenons un exemple :
class Foo {
static function name() {
return 'Foo';
}
static function who() {
echo self::name();
}
}
class Bar extends Foo {
static function name() {
return 'Bar';
}
}
Bar::name();
Cet exemple affichera « Foo » en sortie. Pourtant, comme l'on effectue l'appel de la méthode who() directement depuis la classe Bar, il serait intéressant que la méthode who() prenne en compte le polymorphisme due à l'héritage et utilise le résultat de Bar::name() au lieu de Foo::name().
C'est là ou l'arrivée du Late Static Bindings est intéressante. En remplaçant le mot clé self par static nous allons dire à PHP de résoudre les éléments à la l'exécution et non pas telle qu'elles ont été définies à la compilation.
class Foo {
static function name() {
return 'Foo';
}
static function who() {
echo static::name();
}
}
class Bar extends Foo {
static function name() {
return 'Bar';
}
}
Bar::name();
Résultat notre appel de Bar::name() affichera désormais en sortie « Bar » et plus « Foo ».
Maintenant, la résolution des éléments étant faite à l'exécution, il est probable (je ne l'ai pas testé) qu'utiliser la Compilation Statique Tardive soit un peu consommatrice en temps CPU. Si vous avez des retours d'expérience à ce sujet, je suis preneur.