PHP : résoudre l’erreur “assigning the return value of new by reference is deprecated”

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 :

<?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 PHPComportement
PHP 4Les 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.xLa syntaxe devient invalide et peut produire une erreur de parsing.
PHP 8.xLa 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 -l sur les fichiers modifiés.
  • Testez en staging avant production.
  • Sur WordPress, contrôlez les logs PHP après correction.

Articles liés sur SkyMinds

À 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

Gravatar for Matt Biscay

Je suis Matt Biscay, développeur WordPress & WooCommerce certifié chez Codeable, administrateur système et enseignant.

J’aide les entreprises à créer, optimiser et fiabiliser leurs sites WordPress avec une approche technique propre : performance, sécurité, maintenance, développement sur mesure et résolution de problèmes complexes.

Sur Skyminds, je partage des tutoriels WordPress, WooCommerce, Linux et administration système, avec des solutions testées sur des cas réels et pensées pour durer.

Découvrez mes services WordPress et WooCommerce.

Opinions