W3docs

eval()

La fonction eval() en PHP évalue une chaîne comme du code PHP à l'exécution. Découvrez sa syntaxe, ses risques et les alternatives plus sûres.

Introduction à la fonction eval()

La fonction eval() évalue une string comme du code PHP et l'exécute au moment de l'exécution — c'est-à-dire lorsque le script atteint l'appel à eval(). Au lieu d'écrire du code compilé en avance par le parseur PHP, vous passez à eval() une string qui est compilée et exécutée à la volée.

Cela fait de eval() l'un des construits les plus puissants — et les plus dangereux — du langage. Cette page couvre sa syntaxe, ce qu'elle retourne, les rares cas où elle est véritablement utile, les risques de sécurité qui en font un dernier recours, ainsi que les alternatives plus sûres à privilégier.

eval() est un construt de langage, pas une fonction ordinaire. Vous ne pouvez pas l'appeler indirectement via un nom de fonction variable ni la passer à des fonctions de rappel.

Syntaxe

eval(string $code): mixed

L'unique argument est une string de code PHP. Quelques règles importantes :

  • N'incluez pas la balise d'ouverture <?php. La string est déjà traitée comme du source PHP, donc ajouter <?php vous ramènerait en « mode HTML ».
  • Le code doit être syntaxiquement valide et terminé. Un point-virgule manquant ou une accolade non fermée produit une erreur de parsing. Depuis PHP 7, une erreur de parsing dans eval() lève une exception ParseError que vous pouvez intercepter — les versions antérieures retournaient false.

Valeur de retour

La valeur retournée par eval() dépend de ce que fait le code évalué :

  • Si le code exécute une instruction return, eval() retourne cette valeur.
  • Sinon, elle retourne null.
<?php

$result = eval('return 2 + 3;');
echo $result; // 5

C'est pourquoi un return dans eval() termine uniquement la string évaluée, et non votre script entier — le contrôle revient à la ligne suivant eval(). Consultez l'instruction return pour comprendre le comportement de return dans les fonctions ordinaires.

Exemple de base

Voici l'utilisation la plus simple possible — construire une string de code et l'exécuter :

php— editable, runs on the server

La variable $code contient du PHP valide qui affiche Hello, world!. eval() compile et exécute cette string à l'exécution, ce qui affiche le message. Notez qu'il n'y a pas de balise <?php dans la string.

Intercepter les erreurs en toute sécurité

Comme du code invalide lève une ParseError, entourez du code non fiable ou généré dans un bloc try/catch pour qu'une mauvaise string ne fasse pas planter l'ensemble de la requête :

<?php

try {
    eval('echo "missing semicolon"'); // no terminating ;
} catch (ParseError $e) {
    echo "Could not evaluate: " . $e->getMessage();
}

Ceci affiche un message « Could not evaluate » au lieu d'une erreur fatale, ce qui permet à votre script de continuer.

Quand utiliser eval() ?

Dans le PHP moderne, presque jamais — c'est la réponse honnête. Les cas d'usage légitimes et limités comprennent :

  • Les moteurs de templates ou d'expressions qui compilent un mini-langage personnalisé en PHP (Twig et Blade font quelque chose de conceptuellement similaire, mais avec un sandboxing poussé).
  • La mise en cache de configurations compilées sous forme de PHP ensuite chargé via eval, bien qu'écrire un vrai fichier .php et utiliser include soit plus rapide et plus sûr.
  • Les outils éducatifs ou de débogage tels que les REPLs où l'entrée est entièrement fiable.

Si la valeur que vous devez calculer est une donnée (des nombres, du JSON, une liste d'options), vous n'avez presque certainement pas besoin de eval().

Risques de sécurité

eval() exécute tout ce qu'on lui passe. Si une partie quelconque de la string peut être influencée par une entrée utilisateur, un attaquant peut exécuter du code arbitraire — lire des fichiers, supprimer des données ou prendre le contrôle du serveur. Il s'agit d'une vulnérabilité classique d'exécution de code à distance (RCE).

<?php

// NEVER do this:
$expr = $_GET['expr'];          // attacker-controlled
eval("\$answer = $expr;");      // attacker can inject any PHP

Une requête comme ?expr=1; system('rm -rf /') exécuterait la commande injectée. Considérez tout eval() sur des entrées utilisateur comme un exploit garanti.

Alternatives plus sûres

Avant de recourir à eval(), vérifiez si l'une de ces options couvre votre besoin :

ObjectifÀ utiliser à la place de eval()
Analyser des données structuréesjson_decode()
Appeler une fonction choisie à l'exécutionCallback / fonctions variables
Exécuter du code stocké dans un fichierinclude / require
Associer une string à un comportementUn match/switch ou un array de closures
Évaluer des expressions mathématiquesUne bibliothèque dédiée d'analyse d'expressions

Conclusion

eval() évalue une string comme du code PHP à l'exécution, retournant le résultat d'une instruction return à l'intérieur ou null dans le cas contraire. C'est un outil véritablement puissant, mais aussi une source majeure de failles de sécurité — toute entrée contrôlée par l'utilisateur qui lui est passée constitue un bug d'exécution de code à distance. Utilisez-la uniquement lorsque l'entrée est entièrement fiable et qu'aucun construt natif ne convient, enveloppez-la dans un try/catch pour ParseError, et privilégiez les alternatives plus sûres ci-dessus chaque fois que possible.

Pratique

Pratique
Quel est le rôle de la fonction eval() en PHP ?
Quel est le rôle de la fonction eval() en PHP ?
Was this page helpful?