eval() 將字串作為 PHP 程式碼執行:
mixed eval ( string $phpcode )
return,回傳 NULLfalsereturn 會立即終止評估$string = "beautiful"; $time = "winter"; $str = 'This is a $string $time morning!'; echo $str . "
"; // 輸出:This is a $string $time morning! eval("\$str = \"$str\";"); // 雙層跳脫,實際執行:$str = "This is a beautiful winter morning!"; echo $str; // 輸出:This is a beautiful winter morning!
CodeIgniter 資料庫核心 system/database/DB.php 利用 eval() 依設定動態建立類別:
if (!isset($active_record) || $active_record == TRUE) {
require_once(BASEPATH . 'database/DB_active_rec.php');
if (!class_exists('CI_DB')) {
eval('class CI_DB extends CI_DB_active_record { }');
}
} else {
if (!class_exists('CI_DB')) {
eval('class CI_DB extends CI_DB_driver { }');
}
}
require_once(BASEPATH . 'database/drivers/' . $params['dbdriver'] . '/' . $params['dbdriver'] . '_driver.php');
$driver = 'CI_DB_' . $params['dbdriver'] . '_driver';
$DB = new $driver($params);
此技巧讓框架依啟用 Active Record 與否,動態決定繼承鏈,避免大量 if/else 判斷。
eval() 執行任意代碼,若輸入含使用者資料,極易導致遠端代碼執行(RCE)漏洞。
eval() 是把雙面刃,理解其運作機制有助於閱讀框架源碼,但實務開發中應盡量避免使用。現代 PHP 提供更安全、可維護的替代方案。