Si vous maintenez une vieille application PHP, un vieux plugin WordPress, un ancien forum ou un script rescapé des années PHP 4, vous pouvez tomber sur ce message :
Deprecated: Assigning the return value ofnew by reference is deprecatedLangage du code :JavaScript(javascript)
Ce message signifie qu’un objet est créé avec new, puis affecté par référence avec &=. C’était une vieille habitude issue de PHP 4. En PHP moderne, elle est inutile. En PHP 7 et plus, elle est même invalide.
La correction est presque toujours très simple : supprimez le &.
Le code PHP problématique
Le vieux code ressemble généralement à ceci :
<?php
$object =& new Some_Class();Langage du code :HTML, XML(xml)
Ou, dans une ancienne bibliothèque :
<?php
$db =& new Database();
$mailer =& new Mailer();
$parser =& new Xml_Parser();Langage du code :HTML, XML(xml)
Le problème est le symbole & placé avant new. Il demande à PHP d’assigner par référence le résultat de la création d’objet.
En PHP moderne, cette écriture n’a plus de raison d’être.
La correction moderne
Remplacez :
<?php
$object =& new Some_Class();Langage du code :HTML, XML(xml)
par :
<?php
$object = new Some_Class();Langage du code :HTML, XML(xml)
Autrement dit : retirez simplement le &.
Exemple complet :
<?phpdeclare(strict_types=1);
finalclassExample_Service{
publicfunctionrun(): void{
echo'Service lancé';
}
}
$service = new Example_Service();
$service->run();Langage du code :HTML, XML(xml)
Cette version fonctionne avec PHP moderne et ne déclenche pas d’avertissement lié aux références.
Pourquoi cette ancienne syntaxe existait ?
Sous PHP 4, les objets étaient copiés par valeur dans beaucoup de situations. Pour éviter des copies inutiles, de nombreux développeurs écrivaient donc du code avec des références explicites :
<?php
$object =& new Some_Class();Langage du code :HTML, XML(xml)
À l’époque, cette pratique pouvait avoir un intérêt. Mais PHP 5 a changé le modèle objet : les variables contenant des objets manipulent un identifiant d’objet. L’affectation directe suffit donc dans la plupart des cas.
Résultat : l’ancien & est devenu inutile, puis déprécié, puis interdit.
PHP 5, PHP 7, PHP 8 : ce qui change
Version PHP
Comportement
PHP 4
Les références étaient souvent utilisées pour éviter des copies d’objets.
PHP 5.x
$object =& new Class(); déclenche un avertissement de dépréciation.
PHP 7.x
La syntaxe devient invalide et peut produire une erreur de parsing.
PHP 8.x
La syntaxe reste invalide. Le code doit être corrigé.
Si vous voyez ce message sur un vieux site, cela signifie généralement que le code n’a pas été modernisé depuis très longtemps. Ce n’est pas seulement un avertissement cosmétique : c’est un signal de dette technique.
Correction rapide avec grep
Pour trouver les occurrences problématiques dans un projet, utilisez grep.
grep -RIn --include="*.php"'=&[[:space:]]*new' .Langage du code :PHP(php)
Cette commande cherche les affectations du type =& new dans les fichiers PHP.
Exemple de sortie :
./includes/class-old.php:42:$parser =& new Xml_Parser();
./lib/database.php:103:$db =& new Database();
Vous pouvez ensuite corriger manuellement :
$parser = new Xml_Parser();
$db = new Database();Langage du code :PHP(php)
Pour un petit projet, la correction manuelle est préférable. Elle vous force à lire le contexte. Et lire le contexte, en maintenance PHP, évite parfois de débrancher le mauvais respirateur.
Correction automatique avec prudence
Sur une grosse base de code, vous pouvez préparer un remplacement automatique. Mais faites-le dans une branche Git, jamais directement en production.
Commencez par créer une branche :
git checkout -b fix/remove-new-by-referenceLangage du code :JavaScript(javascript)
Vous pouvez ensuite utiliser Perl pour remplacer =& new par = new dans les fichiers PHP :
find . -type f -name "*.php" -print0 \
| xargs -0 perl -pi -e 's/=\s*&\s*new/= new/g'Langage du code :JavaScript(javascript)
Puis vérifiez les changements :
git diff
Enfin, lancez au minimum une vérification syntaxique :
find . -type f -name "*.php" -print0 \
| xargs -0 -n1 php -lLangage du code :JavaScript(javascript)
Sur un projet WordPress, lancez aussi les tests fonctionnels essentiels : chargement du front-office, administration, formulaires, panier WooCommerce si présent, cron, API REST et logs d’erreur PHP.
Dans WordPress : ne modifiez pas le core
Sur un vieux site WordPress, ce message peut apparaître dans un ancien thème, un vieux plugin, ou une bibliothèque incluse par un plugin. Ne modifiez pas les fichiers core de WordPress pour corriger cela.
Procédez plutôt ainsi :
identifiez le fichier exact dans le message d’erreur ;
vérifiez s’il appartient à un plugin, un thème ou une librairie tierce ;
mettez à jour le plugin ou le thème si une version compatible existe ;
si le plugin est abandonné, remplacez-le ;
si c’est un thème enfant ou du code maison, corrigez le code ;
testez en staging avant production.
Si l’erreur vient d’un plugin commercial abandonné, la correction d’une ligne peut suffire temporairement. Mais la vraie décision reste : faut-il encore faire tourner un composant qui porte des conventions PHP 4 en 2026 ? La réponse est souvent dans la question.
Ne pas masquer l’erreur avec error_reporting
Une mauvaise “solution” consiste à masquer l’avertissement en modifiant error_reporting. C’était déjà discutable en PHP 5. Aujourd’hui, c’est inutile pour PHP 7+ et PHP 8+, car le code peut simplement ne plus être parsé.
Évitez donc ce genre de rustine :
error_reporting(E_ALL & ~E_DEPRECATED);
Masquer une dépréciation ne modernise pas le code. Cela revient à éteindre le voyant moteur avec du ruban adhésif. Très esthétique, mais peu mécanique.
Objets PHP : faut-il encore utiliser & ?
Dans du code PHP moderne, vous n’avez presque jamais besoin d’écrire & new. En fait, vous ne devez pas l’écrire du tout.
Ce code suffit :
<?php
$user = new User();
$service = new User_Service($user);Langage du code :HTML, XML(xml)
Si plusieurs variables pointent vers le même objet, elles manipulent le même objet :
<?php
$user = new User();
$other_user = $user;
$other_user->name = 'Matt';
echo $user->name;Langage du code :HTML, XML(xml)
Le résultat sera :
Matt
Pas besoin de référence explicite autour de new.
Quand les références PHP restent utiles
Les références existent toujours en PHP, mais elles doivent rester rares et intentionnelles.
Le unset( $item ) après une boucle par référence évite des effets de bord désagréables. Les références PHP sont puissantes, mais elles aiment piéger les gens pressés.
Checklist de migration PHP
Cherchez les occurrences de =& new.
Remplacez-les par = new.
Ne masquez pas l’erreur avec error_reporting.
Ne modifiez jamais le core WordPress.
Mettez à jour ou remplacez les plugins abandonnés.
Lancez php -l sur les fichiers modifiés.
Testez en staging avant production.
Sur WordPress, contrôlez les logs PHP après correction.
Le message Assigning the return value of new by reference is deprecated indique un vieux réflexe PHP 4 : affecter le résultat de new par référence.
La correction moderne est presque toujours la même :
$object = new Some_Class();Langage du code :PHP(php)
Supprimez le &, testez le code, puis profitez-en pour auditer le composant concerné. Si une bibliothèque contient encore ce type de syntaxe, elle mérite probablement une vraie mise à jour. Pas juste un coup de plumeau.
Samedi soir, je suis allé voir Andy McKee, Antoine Dufour et Preston Reed à la Cité des Congrès de Nantes.
18h30. Nous sommes arrivés bien en avance, assis au 4ème rang. Il n’y avait pas tant de monde que cela : nous n’avons pas eu droit à l’auditorium mais à la salle à droite au premier étage – celle qui sert de salle de projection lors des Utopiales (que je vous recommande chaudement!).
19h30. Je me retourne : la salle est pleine ! Les lumières s’éteignent. Andy McKee arrive sur scène et nous dévoile le programme de la soirée : trois guitaristes – Antoine Dufour, Preston Reed et lui-même – vont se produire individuellement sur scène, avant de se retrouver pour jouer le grand final.
Antoine Dufour
Antoine Dufour, né en 1979, est un guitariste acoustique québécois qui a commencé la guitare à 15 ans et a 5 albums à son actif. Antoine est très drôle, c’est probablement celui qui nous a le plus fait rire – avec son accent déjà mais pas seulement!
Son style est empreint de finesse, de groove et de technique très maîtrisée. C’est vraiment du bon.