php - php - create_function 重构
问题描述
我正在尝试重构一些代码,如下所示(还有更多):
$smcFunc += array(
'entity_fix' => create_function('$string', '
$num = substr($string, 0, 1) === \'x\' ? hexdec(substr($string, 1)) : (int) $string;
return $num < 0x20 || $num > 0x10FFFF || ($num >= 0xD800 && $num <= 0xDFFF) || $num == 0x202E ? \'\' : \'&#\' . $num . \';\';'),
'htmlspecialchars' => create_function('$string, $quote_style = ENT_COMPAT, $charset = \'ISO-8859-1\'', '
global $smcFunc;
return ' . strtr($ent_check[0], array('&' => '&')) . 'htmlspecialchars($string, $quote_style, ' . ($utf8 ? '\'UTF-8\'' : '$charset') . ')' . $ent_check[1] . ';'),
'htmltrim' => create_function('$string', '
global $smcFunc;
return preg_replace(\'~^(?:[ \t\n\r\x0B\x00' . $space_chars . ']| )+|(?:[ \t\n\r\x0B\x00' . $space_chars . ']| )+$~' . ($utf8 ? 'u' : '') . '\', \'\', ' . implode('$string', $ent_check) . ');'),
'strlen' => create_function('$string', '
global $smcFunc;
return strlen(preg_replace(\'~' . $ent_list . ($utf8 ? '|.~u' : '~') . '\', \'_\', ' . implode('$string', $ent_check) . '));'),
// ...
);
所以因为entity_fix
我已经做了:
'entity_fix' => function($string) use ($num) {
$num = 0 === strpos($string, 'x') ? hexdec(substr($string, 1)) : (int) $string;
return $num < 0x20 || $num > 0x10FFFF || ($num >= 0xD800 && $num <= 0xDFFF) || $num == 0x202E
? ''
: '&#' . $num . ';';
},
但我得到:
Undefined variable: num
这是合乎逻辑的。
那么,是否可以在smcFunc
不完全重构使用的情况下重构这个数组()?
解决方案
尝试在没有use()
语言结构的情况下定义函数。$num
在函数中定义,不需要在函数范围之外继承。
'entity_fix' => function($string) {
$num = 0 === strpos($string, 'x') ? hexdec(substr($string, 1)) : (int) $string;
return $num < 0x20 || $num > 0x10FFFF || ($num >= 0xD800 && $num <= 0xDFFF) || $num == 0x202E
? ''
: '&#' . $num . ';';
},
推荐阅读
- c# - EF Core:AutoMapper ProjectTo ToListAsync 抛出“对象引用未设置为对象的实例”
- oracle - 如何在 oracle sql developer 中为 oracle e 业务套件表设置模式
- excel - 结合 IF、ISTEXT 和 LEN 函数
- python - 如何制作对数缩放的 Tkinter 滑块?
- google-cloud-platform - 无法将 dicom 文件从 GCP dicom 存储导出到具有原始文件名的存储
- google-apps-script - 当在特定列范围内输入特定单词/数字时,Google 应用程序脚本将提示用户
- c# - 带有 IDbDataParameter 参数的模拟方法
- python - 如何在银行网站上查找元素
- requirejs - 需要配置:未捕获的错误:脚本错误:datatables.net
- javascript - 使用与 Java 相同的 cryptojs 使用 Javascript 进行 AES 加密 - AES/CBC/PKCS5Padding