微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

没有 create_function 和 eval

如何解决没有 create_function 和 eval

我正在尝试创建一个类来清理品牌数据,然后再将其添加到我的数据库中。

如您所见,我添加了通用过滤器(可在其他地方使用)。另一方面,一些领域将需要个性化的清洁。这就是我在数组中创建“函数”的原因。

我的代码目前可以运行,但是 create_function 函数已被弃用,我想删除它,但如果不使用 eval,我找不到替代方法

你能帮我找到解决办法吗?谢谢。

<?PHP
class VehMarques
{
    private static $fields_allowed = [
    
    '_id' =>    
    [
        'instanceof' => '\MongoDB\BSON\ObjectID',],'name' => 
    [
        'function' => 'if(!isset($name) && !isset($age)){return false;}','user' =>
    [
        'required','instanceof' => '\MongoDB\BSON\ObjectID','centre' =>
    [
        'required','time' =>
    [
        'instanceof' => 'MongoDB\BSON\UTCDateTime',];
    
    public static function add(array $fields)
    {
        $fields_options=array();
        foreach(self::$fields_allowed as $key => $val)
        {
            foreach($val as $key1 => $val1)
            {
                if(in_array($val1,array('required')))
                {
                    $fields_options[$val1][$key] = null;
                }
                else
                {
                    $fields_options[$key1][$key] = $val1;
                }
            }
        }
        
        if(!empty(self::$fields_allowed) && !empty(array_diff_key($fields,self::$fields_allowed)))
        {
            return false;
        }
        
        if(!empty($fields_options['function']))
        {
            foreach($fields_options['function'] as $func)
            {
                $func = preg_replace('/\$([a-zA-Z0-9]+)/','$fields[\'$1\']',$func);
                
                if(create_function('$fields',$func)($fields) === false)
                {
                    return false;
                }
            }
        }
        
        if(!empty($fields_options['required']) && !empty(array_diff_key($fields_options['required'],$fields)))
        {
            return false;
        }
        
        if(!empty($fields_options['instanceof']))
        {
            foreach($fields_options['instanceof'] as $key => $val)
            {
                if(!($fields[$key] instanceof $val))
                {
                    return false;
                }
            }
        }
        
        if(!isset($fields['_id']))
        {
            $fields['_id'] = new \MongoDB\BSON\ObjectID();
        }
        
        if(!isset($fields['time']))
        {
            $fields['time'] = new MongoDB\BSON\UTCDateTime();
        }
        
        return true;
    }
}

$insert_marque = array(
'_id' => new \MongoDB\BSON\ObjectID(),'name' => 'Test','user' => new \MongoDB\BSON\ObjectID(),'centre' => new \MongoDB\BSON\ObjectID(),'time' => new MongoDB\BSON\UTCDateTime()
);

var_dump(VehMarques::add($insert_marque));
?>

解决方法

永远不要使用可以从字符串创建可执行代码的函数的 eval。这是非常糟糕的做法。

改用回调:

class VehMarquesValidator
{
    private $callbacks = [];
    
    public function __construct() 
    {
        $this->callbacks = [
            [$this,'validateVehMarques']
        ];
    }

    public function validate(array $fields) 
    {
        foreach ($this->callbacks as $callback) {
            if (!call_user_func($callback,$fields)) {
                return false;
            }
        }

        return true;
    }

    private function validateVehMarques(array $fields) 
    {
        if(isset($fields['name'])) {
            return true;
        }
        
        if(isset($fields['age'])) {
            return true;
        }

        return false;
    }            
}

$validator = new VehMarquesValidator();
var_dump($validator->validate([
    'name' => 'Test'
]));

var_dump($validator->validate([
    'no_name' => 'Test'
]));

尽量避免静态方法。这也是不好的做法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。