PHP 5.3 : Résolution statique à la volée - Late Static Bindings
Par Méthylbro le dimanche 18 octobre 2009, 08:00 - Développement - Lien permanent
PHP 5.3 introduit foule de nouveaux concepts intéressants que l'on espérait jusque là. L'un d'entre eux est le Late Static Bindings, Compilation Statique Tardive en français. Il s'agit d'un outil que tous ceux qui utilisent régulièrement le moteur objet de PHP seront sans doutes apprécier.
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.

Commentaires
Ne serait-ce pas plutot un appel a "Bar::who();" plutot qu'a "Bar::name();" qui met en avant le probleme ?