Mayshaymay 5, l'héritage et les attributs statiques
Par hr le jeudi 22 avril 2010, 11:49 - code - Lien permanent
Le support de la programmation objet a été grandement amélioré entre PHP 4 et PHP 5. N'étant pas un grand programmeur, je ne m'étendrai pas sur le sujet, d'autres le font mieux que moi. Par contre je sais reconnaitre un comportement anormal quand j'en vois un et PHP 5 ne semble pas gérer correctement l'héritage d'attributs statiques dans une classe.
Petit démonstration avec un code très simple :
<?
class MyParent {
static $myvar = 'foobar';
static function getvar() {
return self::$myvar;
}
}
class MyChild extends MyParent {
static $myvar = 'barfoo';
}
echo MyParent::getvar();
echo MyChild::getvar();
Et le résultat est, comme on ne s'y attend pas :
foobar foobar
C'est assez déstabilisant et complètement erroné. Cela vient du compilateur PHP qui appelle les méthode statiques dans le contexte de la classe de définition et néglige l'héritage.
Il semble que le problème soit corrigé à partir de la 5.3.0, mais beaucoup de distributions n'en sont pas encore là.
Pour information, les version de PHP de diverses distributions :
Debian lenny :
$ php5-cgi -v PHP 5.2.6-1+lenny8 with Suhosin-Patch 0.9.6.2 (cgi-fcgi) (built: Mar 14 2010 09:02:24) Copyright (c) 1997-2008 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
Centos 5.4 (Final)
$ php -v PHP 5.2.9 (cli) (built: Apr 3 2009 17:33:04) Copyright (c) 1997-2009 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
Ubuntu karmic (9.10)
$ php5 -v PHP 5.2.10-2ubuntu6.4 with Suhosin-Patch 0.9.7 (cli) (built: Jan 6 2010 22:41:56) Copyright (c) 1997-2009 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies