如何在旧插件的验证循环中替换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++; } }
关键细节说明
- 闭包捕获变量:循环里先把当前项的
id存到$id变量中,再通过use ($id)让闭包捕获这个值——避免循环中变量共享导致闭包最后只拿到循环末尾的ID值。 - 语法更安全清晰:闭包不需要像
create_function那样转义引号,代码可读性更强,还消除了潜在的代码注入风险。 - 完全兼容原有逻辑:闭包实现的功能和原
create_function生成的函数完全一致,不会影响插件的验证流程。
内容的提问来源于stack exchange,提问作者Katherine
相关产品推荐
相关产品推荐

