Aller au contenu principal

Passer un vieux code à PHP 8 : les erreurs qui reviennent le plus

Sur les modules, extensions et thèmes que je fais passer sous PHP 8, ce sont presque toujours les mêmes lignes qui bloquent. Rien de compliqué, mais une seule suffit à afficher une page blanche. Les voici, avec leur remplacement, valable aussi sous PHP 7.

PHP
// each() : supprimée en PHP 8
while (list($cle, $valeur) = each($tableau)) { /* ... */ }
foreach ($tableau as $cle => $valeur) { /* ... */ }

// create_function() : supprimée en PHP 8
usort($produits, create_function('$a,$b', 'return $a["prix"] - $b["prix"];'));
usort($produits, function ($a, $b) { return $a['prix'] - $b['prix']; });

// Accolades pour lire un caractère : erreur fatale en PHP 8
$initiale = $nom{0};
$initiale = $nom[0];

// count() sur autre chose qu'un tableau : TypeError en PHP 8
$nb = count($resultats);
$nb = is_countable($resultats) ? count($resultats) : 0;

// Clé absente : avertissement en PHP 8 (simple notice avant)
$page = $_GET['page'];
$page = $_GET['page'] ?? 1;

Ces deux commandes ne remplacent pas un test complet, mais elles trient vite : la première repère les motifs connus, la seconde toutes les erreurs de syntaxe, fichier par fichier. Le reste, notamment les avertissements devenus erreurs, se voit en parcourant le site sur une copie tournant sous PHP 8, avec l’affichage des erreurs activé.

Terminal
# Repérer les motifs les plus courants dans un module ou une extension
grep -rnE "\beach\(|create_function\(|\\\$[A-Za-z_]+\{[0-9\\\$]" --include=*.php .

# Vérifier la syntaxe de chaque fichier avec PHP 8
find . -name '*.php' -print0 | xargs -0 -n1 php8.0 -l | grep -v '^No syntax errors'

Sources

  1. PHP, changements incompatibles de PHP 8.0 php.net