You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在旧插件的验证循环中替换create_function函数?

替换create_function为闭包的解决方案

原代码里的create_function是用来生成触发两个验证动作的回调函数,PHP 7.2+已经废弃了这个函数,用匿名闭包是最直接且安全的替代方案,完全匹配原逻辑还符合现代PHP规范。

修改后的代码

if( is_array($s) ) {
    $c = count($s);
    $a = 0;
    while( $a < $c ) {
        if( isset($s[$a]['validate_callback']) ) {
            $this->create_function[] = $s[$a]['id'];
            $s[$a]['validate_callback'] = '';
            // 该行代码未在后续逻辑中使用,可根据实际情况保留或移除
            $file= addslashes(WC_XSI_SETTINGS . 'validate-' . $s[$a]['id'] . '.php');
            
            // 核心替换:用闭包替代create_function
            $id = $s[$a]['id'];
            $s[$a]['validate_callback'] = function($fields) use ($id) {
                do_action("wc_xsi_settings_validate", $fields);
                do_action("wc_xsi_settings_validate_{$id}", $fields);
            };
        }
        $a++;
    }
}

关键细节说明

  1. 闭包捕获变量:循环里先把当前项的id存到$id变量中,再通过use ($id)让闭包捕获这个值——避免循环中变量共享导致闭包最后只拿到循环末尾的ID值。
  2. 语法更安全清晰:闭包不需要像create_function那样转义引号,代码可读性更强,还消除了潜在的代码注入风险。
  3. 完全兼容原有逻辑:闭包实现的功能和原create_function生成的函数完全一致,不会影响插件的验证流程。

内容的提问来源于stack exchange,提问作者Katherine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 17:30:03