PHP 允許在執行時期動態編譯並執行字串形式的程式碼,這為線上程式碼編輯器、規則引擎、模板系統等場景提供了極大靈活性。但隨著 PHP 版本演進,傳統 create_function() 已被棄用,現代開發需採用更安全、高效的替代方案。
$code = 'return "Hello World!";';
$func = create_function('', $code);
echo $func(); // 輸出:Hello World!
PHP 程式碼執行器
$code = 'return "Hello " . $name;';
$func = eval("return function(\$name) { $code };");
echo $func('World'); // 輸出:Hello World
缺點:eval() 同樣存在嚴重安全風險,生產環境極不推薦。
interface OperationInterface {
public function execute(array $params);
}
class AddOperation implements OperationInterface {
public function execute(array $params) {
return $params['a'] + $params['b'];
}
}
class MultiplyOperation implements OperationInterface {
public function execute(array $params) {
return $params['a'] * $params['b'];
}
}
$operations = [
'add' => new AddOperation(),
'multiply' => new MultiplyOperation(),
];
$action = $_POST['action'] ?? 'add';
$params = $_POST['params'] ?? [];
if (isset($operations[$action])) {
$result = $operations[$action]->execute($params);
echo "結果:$result";
}
use Symfony\Component\ExpressionLanguage\ExpressionLanguage; $language = new ExpressionLanguage(); $expression = 'a + b * 2'; $variables = ['a' => 10, 'b' => 5]; $result = $language->evaluate($expression, $variables); // 20
支援安全的表達式評估,內建沙箱機制,適合規則引擎場景。
將使用者程式碼解析為 AST(抽象語法樹),進行靜態分析、白名單過濾後再執行,安全性最高但實作複雜。
若確有動態執行需求,必須構建隔離環境:
pcntl_alarm() 或 set_time_limit() 防止無限迴圈disable_functions=exec,shell_exec,system,eval,create_function...open_basedir 限制檔案存取範圍| 場景 | 推薦方案 | 安全等級 |
|---|---|---|
| 使用者自訂業務規則 | Symfony ExpressionLanguage | 高 |
| 模板系統 | Twig/Blade 模板引擎 | 高 |
| 線上程式碼編輯器 | Docker 沙箱 + 語法高亮 | 中 |
| 數學表達式計算 | 自定義解析器 / math.php | 高 |
| 動態 RPC 呼叫 | 策略模式 + 服務註冊發現 | 高 |
核心原則:能不用動態執行就不用。現代 PHP 框架提供豐富的擴展機制(中介層、事件、依賴注入、插件系統),絕大多數動態需求皆可透過靜態架構優雅解決。若確有必要,務必採用沙箱隔離、白名單驗證、最小權限原則,將風險降至最低。