WordPress 核心函數 stripslashes_deep 遞歸清理數組/對象/字符串中的斜杠。將其泛化為任意回調函數作用於任意嵌套結構的通用工具。
<?php
function function_deep($callback, $value) {
// 1. 回調可調用性檢查
if (!is_callable($callback)) {
throw new InvalidArgumentException("第一參數必須是可調用的回調");
}
// 2. 數組:遞歸映射
if (is_array($value)) {
// 構造同長度回調數組供 array_map 使用
$callbacks = array_fill(0, count($value), $callback);
return array_map('function_deep', $callbacks, $value);
}
// 3. 對象:遞歸處理屬性
if (is_object($value)) {
$vars = get_object_vars($value);
foreach ($vars as $key => $data) {
$value->{$key} = function_deep($callback, $data);
}
return $value;
}
// 4. 字符串:直接應用回調
if (is_string($value)) {
return call_user_func($callback, $value);
}
// 5. 其他類型(int/float/bool/null/resource)原樣返回
return $value;
}
<?php
$arr = [
"I'm bean",
"I'm bean",
["I'm bean", "I'm bean"],
(object)["name" => "I'm bean", "meta" => ["I'm bean"]]
];
// 添加斜杠
$escaped = function_deep('addslashes', $arr);
print_r($escaped);
/* 輸出結構保持不變,所有字符串單引號被轉義:
Array
(
[0] => I\'m bean
[1] => I\'m bean
[2] => Array
(
[0] => I\'m bean
[1] => I\'m bean
)
[3] => stdClass Object
(
[name] => I\'m bean
[meta] => Array
(
[0] => I\'m bean
)
)
)
*/
| 類型 | 示例 |
|---|---|
| 函數名字符串 | 'addslashes', 'strtoupper', 'trim' |
| 匿名函數 | function($v){ return htmlspecialchars($v, ENT_QUOTES); } |
| 類靜態方法 | ['MyClass', 'sanitize'] |
| 對象方法 | [$obj, 'clean'] |
| 箭頭函數 | fn($v) => str_replace(' ', '_', $v) |
htmlspecialchars 防 XSS 輸出trim 清理用戶輸入首尾空白iconv('GBK','UTF-8',$v) 整個數組xdebug.max_nesting_level=256(或 pcntl 相關),極深嵌套可能溢出__get/__set 魔術方法,注意副作用