eval() 是 PHP 中最具爭議的函數之一 —— 它能將字串當作 PHP 代碼執行,雖然強大,但極易引入安全漏洞與維護噩夢。本文系統梳理其語法、典型場景、風險及替代方案。
eval(string $code): mixed
$code 必須是合法 PHP 代碼,且以分號結尾return 時回傳 NULL;解析錯誤回傳 false<?php
$string = 'beautiful';
$time = 'winter';
$str = 'This is a $string $time morning!';
echo $str . "<br>"; // 輸出原始字串
eval("\$str = \"$str\";"); // 雙重轉義:先插值再執行
echo $str; // This is a beautiful winter morning!
?>
<?php
for ($i = 1; $i <= 10; $i++) {
eval('$a' . $i . ' = ' . ($i * $i) . ';');
}
for ($i = 1; $i <= 10; $i++) {
eval('echo $a' . $i . '."<br>";');
}
echo $a1 + $a10; // 101
?>
現代寫法:直接使用陣列 $a[$i] = $i * $i;,更清晰、安全、效能更好。
| 錯誤寫法 | 問題 | 正確寫法 |
|---|---|---|
eval("echo $a;"); | 若 $a 未定義會報錯 | eval('echo $a;'); 或 eval("echo {$a};"); |
eval('$a.$b'); | 非完整語句,缺分號 | eval('echo $a.$b;'); |
| 直接拼接用戶輸入 | 極高風險:任意代碼執行 | 嚴格白名單驗證或棄用 eval |
$fn = fn() => $a + $b;symfony/expression-language、doctrine/orm 的 DQLdisable_functions=exec,system,shell_exec,passthru,proc_open,popen結論:除非在極受控的開發工具/建構腳本中,生產環境業務代碼嚴禁使用 eval()。現代 PHP 生態提供了更安全、優雅的替代方案。