首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 使用 create_function() 動態建立匿名函數(舊版寫法)

     編輯:PHP 綜合知識

注意:create_function() 自 PHP 7.2 棄用,PHP 8.0 移除。現代 PHP 請使用匿名函數 (Closure) 或 箭頭函數 (fn)。本文僅作歷史參考。

舊版 create_function 範例

<?php
if (count($_POST) > 0) {
    $prepped = create_function('$a', 'return trim($_POST[$a]);');
} elseif (count($_GET) > 0) {
    $prepped = create_function('$a', 'return strtoupper($_GET[$a]);');
} else {
    $prepped = create_function('$a', 'return false;');
}
echo $prepped('file');
?>

現代替代:匿名函數

if (!empty($_POST)) {
    $prepped = fn($a) => trim($_POST[$a] ?? '');
} elseif (!empty($_GET)) {
    $prepped = fn($a) => strtoupper($_GET[$a] ?? '');
} else {
    $prepped = fn($a) => false;
}
echo $prepped('file');

完整 Closure 寫法 (PHP 5.3+)

$prepped = function($a) {
    if (!empty($_POST)) return trim($_POST[$a] ?? '');
    if (!empty($_GET))  return strtoupper($_GET[$a] ?? '');
    return false;
};

create_function 缺點

  • 程式碼以字串傳遞,無法 opcode 快取,效能差
  • 安全風險:字串注入同 eval()
  • 除錯困難:堆疊追蹤顯示 {closure} 無行號
  • 無法使用 use 繼承外部變數

動態建立函數的正規做法

  • 策略模式:預先定義多個 Closure,依條件選擇
  • 工廠函數:回傳不同 Closure
  • eval() 絕對避免(同等風險)

專案中若發現 create_function(),請優先重構為 Closure。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved