mixed eval ( string $phpcode )
return 返回 NULL;解析錯誤返回 falsereturn 語句會立即終止執行$string = "beautiful";
$time = "winter";
$str = 'This is a $string $time morning!';
echo $str . "<br />"; // 輸出:This is a $string $time morning!
eval("\$str = \"$str\";"); // 雙重解析:變量插值
echo $str; // 輸出:This is a beautiful winter morning!
在 system/database/DB.php 中根據配置動態定義類:
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 { }');
}
}
這是框架級「運行時類構建」的典型應用:根據配置決定繼承鏈,避免大量 if/else 分支。
| 風險 | 說明 | 防範措施 |
|---|---|---|
| 代碼注入 | 用戶輸入直接傳入 eval 可執行任意代碼 | **絕不**對不可信數據使用 eval |
| 作用域洩露 | eval 在當前作用域執行,可訪問/修改局部變量 | 封裝在獨立函數/類方法中隔離作用域 |
| 調試困難 | 動態代碼無法靜態分析,錯誤堆棧難定位 | 生產環境禁用,開發期用 xdebug 輔助 |
| 性能開銷 | 每次調用都需編譯解析,無法被 OpCache 緩存 | 熱點路徑避免使用,改用工廠模式/策略模式 |
| 需求 | 推薦方案 | 理由 |
|---|---|---|
| 動態調用方法 | call_user_func / 反射類 | 類型安全、可靜態分析、性能更好 |
| 配置驅動行為 | 策略模式 + 依賴注入 | 符合 SOLID 原則,易測試維護 |
| 數學表達式 | symfony/expression-language | 專用解析器,安全沙箱,功能豐富 |
| 模板渲染 | Twig / Blade / Smarty | 編譯緩存、繼承塊、過濾器、自動轉義 |
eval() 是 PHP 中威力最大也最危險的函數之一。除非在框架底層、模板編譯等**完全可控、極少數**場景,**嚴禁在業務代碼中使用**。現代 PHP 開發應採用設計模式、依賴注入、專用解析器等替代方案,從架構層面消除動態代碼執行需求。