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';
}

?>