Différence entre static:: et self:: en PHP 5.3

Grâce au Late Static Binding introduit dans PHP 5.3, la gestion des classes va encore plus loin. Un nouveau mot-clef a été introduit dans le langage, il s’agit de ‘static’. Son utilisation ressemble étrangement à ‘self’, mais il y a une très grande différence entre les deux.

Démonstration :

<?php
class test1 {
protected static $a = 0;
public static function go () {
echo self::$a;
}
}
class test2 extends test1 {
protected static $a = 1;
}
test2::go ();

En PHP 5.2 et PHP 5.3, le code ci-dessus va renvoyer 0. Pas normal me dites-vous, et vous avez bien raison. En effet, l’analyse du mot-clef ‘self’ se fait au moment de la compilation, donc son utilisation ignore toutes les classes étendues.

Et voici la magie de PHP 5.3. Réécrivez la fonction go comme suit dans test1 :

<?php
public static function go () {
echo static::$a;
}

Oh magie, le code affiche bien « 1 » !

En conclusion : Les apports de PHP 5.3 vont bien au delà de ce point de détail. Toutefois la version est encore largement buggée et inutilisable en production. Mais surveillez les nouveautés (notamment au niveau du langage objet), il y a vraiment de bonnes choses dedans.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *