Ce message est le plus fréquemment rencontré lorsqu'on transfère un site créé sous PHP4 vers PHP5, que ce soit localement ou si l'hébergement met à jour sa version de PHP.
Pour en comprendre la raison, l'historique de PHP est indispensable.
PHP version 4 a apporté un support embryonnaire de la programmation objet (POO). Mais cette version conservaitde nombreuses lacunes, en particulier dans la gestion des objets, qui n'étaient vus, au mieux, que comme des tableaux améliorés.
Sous PHP4, lorsqu'on désirait retourner une référence (c'est à dire uniquement un myen d'accéder directement à un objet créé), il était indispensable d'utiliser l'opérateur & soit dans l'assignation de l'objet, soit dans la fonction retournant un objet, sans cet artifice, on avait une copie de l'objet, ce qui n'était jamais le but voulu.
// exemple de création de référence à un objet
$obj =& new StdClass ;
// Exemple de renvoi de référence depuis une fonction
function maFonction()
{
return & new StdClass ;
}
// Exemple de fonction forçant un retour par référence
function &maFonction()
{
return new StdClass ;
}
Ici nous voyons bien le flou artistique régnant dans la méthodologie et les bricolages nécessaire spour obtenir des références aux objets.
Avec PHP 5, la programmation objet a fortement évolué sous PHP, avec en particulier une véritable mise en oeuvre complète des concepts objets tels qu'on les trouve dans des lanages tels C++, SmallTalk ou Java.
Avec cette nouvelle conceptualisation et mise en oeuvre des objets, l'ensemble des bricolages plus ou moins fiables utilisés en PHP 4 sont devenus au mieux obsolètes, au pire de mauvaises méthodes. En PHP 5, toute création d'objet est automatiquement une référnce, le seul moyen pour dupliquer (copier) un objet est l'utilisation de la méthode clone().
La syntaxe correcte PHP 5 devient donc:
// exemple de création de référence à un objet
// Un objet est maintenant TOUJOURS une référence
$obj = new StdClass ;
// Exemple de renvoi de référence depuis une fonction
function maFonction()
{
return new StdClass ;
}
// Exemple de fonction forçant un retour par référence
// Ne JAMAIS utiliser, lèvera une exception Deprecated
function &maFonction()
{
return new StdClass ;
}
En ce sens, PHP 5 rend les choses plus claires.