如何解决PHP 将 create_function 更改为匿名函数
我继承了一些旧代码,需要将 create_function 转换为匿名函数。我已经这样做了,但由于我看不到匿名函数中的代码,我不知道它是否等于前一个 create_function 中的代码。
这是代码,我的问题是:“我的翻译”是否等于“原始代码”?
public static function makePhpVdtorFromRegex($regex,$match = TRUE)
{
//original code
$s = 'return '.($match?'':'0 == ').'preg_match(\'/'.addslashes($regex).'/\',$v);';
return create_function('$v',$s);
// my translation
return function($v) use ($regex,$match) {
return ($match?'':'0 == ').preg_match('/'.addslashes($regex).'/',$v);
};
}
我相信 makePhpVdtorFromRegex 代表“Make PHP Validator From Regex”。验证这一点的问题是我不确定实际的验证器在哪里使用,因为这个匿名函数存储在一个数组中,该数组用于在稍后进行表单输入验证时验证输入。
因为 $regex 和 $match 只存在于 makePhpVdtorFromRegex() 中,所以当验证器最终运行时,它们将不可用,对吧?所以我怀疑我的翻译行不通?
解决方法
要模仿原始行为,您应该可以将其替换为(出于测试目的,我将该方法转换为函数):
function makePhpVdtorFromRegex($regex,$match = true) {
if ($match) {
return function($value) use ($regex) {
return preg_match('/'.addslashes($regex).'/',$value);
};
}
return function($value) use ($regex) {
// Same as '0 == preg_match(...)' from original code
return !preg_match('/'.addslashes($regex).'/',$value);
};
}
$validator = makePhpVdtorFromRegex('^[a-z]+$');
// Check if something matches
var_dump($validator('abc')); // true
// Check if something doesn't match
$validator = makePhpVdtorFromRegex('^[a-z]+$',false);
var_dump($validator('123')); // true
如果您以后有机会研究实际的表单验证,甚至可以控制正则表达式本身,您可以将此代码重写为更简单的内容,例如:
function getRegexValidator() {
return function($regex,$value) {
return preg_match($regex,$value);
};
}
$validator = getRegexValidator();
// Check if something matches
var_dump($validator('/^[a-z]+$/','abc')); // true
// Check if something doesn't match
var_dump(!$validator('/^[a-z]+$/','123')); // true
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。