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 of new by reference is deprecatedCode language: 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();Code language: HTML, XML (xml)
Ou, dans une ancienne bibliothèque :
<?php
$db =& new Database();
$mailer =& new Mailer();
$parser =& new Xml_Parser();Code language: 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();Code language: HTML, XML (xml)
par :
<?php
$object = new Some_Class();Code language: HTML, XML (xml)
Autrement dit : retirez simplement le &.
Exemple complet :
Un projet WordPress en tête ?
Vous avez une idée claire de ce que vous voulez, mais pas les ressources en interne pour le faire bien. Je développe des sites et extensions WordPress sur-mesure — sans délais à rallonge ni mauvaises surprises.
Décrivez-moi votre projet →<?php
declare(strict_types=1);
final class Example_Service {
public function run(): void {
echo 'Service lancé';
}
}
$service = new Example_Service();
$service->run();Code language: 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();Code language: 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' .Code language: 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();Code language: 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-referenceCode language: 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'Code language: 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 -lCode language: 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);Code language: 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;Code language: 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.
Exemples valables :
<?php
function increment(int &$number): void {
$number++;
}
$count = 1;
increment($count);
echo $count;Code language: HTML, XML (xml)
Ici, le passage par référence est explicite dans la signature de la fonction. C’est une intention claire.
Autre exemple : une boucle sur un tableau par référence, à manier avec prudence :
<?php
$items = array( 1, 2, 3 );
foreach ( $items as &$item ) {
$item *= 2;
}
unset( $item );Code language: HTML, XML (xml)
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 -lsur les fichiers modifiés. - Testez en staging avant production.
- Sur WordPress, contrôlez les logs PHP après correction.
Articles liés sur SkyMinds
- PHP : corriger une erreur preg_match compilation failed
- WordPress : mettre à jour le code YouTube
- Linux : vider un fichier avec truncate
À retenir
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();Code language: 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.
Sources
- PHP Manual : changements incompatibles PHP 7.0, affectation de new par référence
- PHP Manual : références en PHP
- PHP Manual : passage par référence
- WordPress PHP Coding Standards
Besoin d'un coup de main ?
Ce bug qui traîne depuis des semaines, ce plugin qui casse votre mise en page, cette fonctionnalité que personne n'arrive à implémenter proprement — c'est exactement ce que je règle au quotidien depuis 20 ans.
Parlons de votre problème →