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): mixedL'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<?phpvous 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 exceptionParseErrorque vous pouvez intercepter — les versions antérieures retournaientfalse.
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; // 5C'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 :
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.phpet utiliserincludesoit 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 PHPUne 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ées | json_decode() |
| Appeler une fonction choisie à l'exécution | Callback / fonctions variables |
| Exécuter du code stocké dans un fichier | include / require |
| Associer une string à un comportement | Un match/switch ou un array de closures |
| Évaluer des expressions mathématiques | Une 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.