Changements dans les classes et objets
instanceof, is_a(), is_subclass_of() et catch
En PHP 5.0, is_a() a été rendu abandonné et remplacé
par l'opérateur instanceof. Il y a eu des problèmes
dans les premières implantations
de instanceof, qui se base sur __autoload()
pour rechercher les classes non définies. Si la classe n'est pas définie,
instanceof émettait une erreur fatale
E_ERROR
, après l'échec de __autoload().
Le même comportement apparaissait avec l'opérateur catch
et la fonction is_subclass_of().
Aucune de ces instructions n'appelle plus __autoload() en PHP 5.1.x, et les palliatifs à base de class_exists() utilisé dans le code écrit en PHP 5.0.x ne sont plus nécessaires.
Méthodes privées abstraites
Les méthodes privées abstraites sont supportées en PHP entre 5.0.0 et et 5.0.4, mais elles ont été abandonnées car private et abstract sont mutuellement exclusif.
Changements dans les règles d'héritage
Avec PHP 5.0, les déclarations de fonctions dans les interfaces sont
traitées exactement de la même manière que pour les déclarations de
fonctions dans les classes. Ce n'est plus le cas depuis octobre 2004,
au moment où seuls l'option d'accès public a été
autorisée dans les déclarations d'interface. Depuis avril 2005, ce qui
est antérieur à PHP 5.0b1, l'option static a aussi
été autorisée. Mais les options protected
and private émettent désormais une erreur
E_ERROR
, tout comme abstract.
Notez que cette modification ne va pas affecter votre code existant,
car aucune de ces options n'a de sens dans le cadre d'une interface.
Changements dans les règles d'héritages
En PHP 5.0, il était possible d'avoir une déclaration de fonction qui dérivait d'une classe ayant la même fonction mais pas la même signature. Par exemple :
Ce code va émettre une erreur E_STRICT
si utilisé
avec PHP 5.1.x.
<?php class Base { function &return_by_ref() { $r = 1; return $r; } } class Derived extends Base { function return_by_ref() { return 1; } } ?>
Constantes de classe
En PHP 5.0.x, le code suivant était valide :
En PHP 5.1.x, la redéfinition d'une constante de classe émet une
erreur fatale E_ERROR
.
<?php class test { const foobar = 'foo'; const foobar = 'bar'; } ?>