PHP 将 create_function 更改为匿名函数

PHP change create_function to anonymous function

我继承了一些旧代码,需要将 create_function 转换为匿名函数。我已经这样做了,但是因为我看不到匿名函数中的代码,所以我不知道它是否等于前一个 create_function.

中的代码

这是代码,我的问题是:'my translation' 等于 'original code' 吗?

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