PHP 早期提供 create_function() 允許在執行期根據字串建立匿名函數。但此函數自 PHP 7.2 起棄用,PHP 8.0 已移除。現代開發應改用匿名函數(Closure)或箭頭函數。
<?php
// ⚠️ PHP 7.2+ 棄用,PHP 8.0+ 會報錯
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');
?>
使用箭頭函數搭配變數綁定,程式碼更簡潔、安全、效能更好:
<?php
// 根據請求方式動態決定處理邏輯
$handler = match (true) {
!empty($_POST) => fn($key) => trim($_POST[$key] ?? ''),
!empty($_GET) => fn($key) => strtoupper($_GET[$key] ?? ''),
default => fn($key) => false,
};
// 使用
echo $handler('file');
?>
將不同處理邏輯封裝為獨立的可呼叫類別,符合開放封閉原則:
<?php
interface InputProcessor {
public function process(string $key): mixed;
}
class PostProcessor implements InputProcessor {
public function process(string $key): mixed {
return trim($_POST[$key] ?? '');
}
}
class GetProcessor implements InputProcessor {
public function process(string $key): mixed {
return strtoupper($_GET[$key] ?? '');
}
}
class NullProcessor implements InputProcessor {
public function process(string $key): mixed {
return false;
}
}
// 工廠函數
function getProcessor(): InputProcessor {
if (!empty($_POST)) return new PostProcessor();
if (!empty($_GET)) return new GetProcessor();
return new NullProcessor();
}
// 使用
$processor = getProcessor();
echo $processor->process('file');
?>
eval(),極易導致注入攻擊。{closure},難以定位問題。現代 PHP 開發應擁抱匿名函數、箭頭函數與物件導向模式,編寫更安全、可維護的動態邏輯。