替换create_function为匿名函数后$encrypt/$decrypt未正常工作求助
嘿,我一眼就看出问题所在了!你之前用create_function的写法和现在的匿名函数逻辑完全不是一回事,这就是为啥$encrypt/$decrypt没按预期工作的原因。
先搞懂两者的核心区别
原来的create_function是把你拼接的字符串当成PHP代码直接解析执行的。比如说,如果你的$encrypt是"return base64_encode($text);",create_function会把这段代码直接塞进生成的函数体里,调用的时候就真的会执行base64_encode($text)并返回结果。
但你现在用匿名函数的use语法,只是把$encrypt和$decrypt作为普通字符串变量引入到函数里——你当前的代码是直接返回这个字符串,而不是执行它代表的代码,这当然达不到加密/解密的效果啦!
两种可行的解决办法
办法1:用eval执行代码字符串(谨慎使用)
如果你暂时不想改动$encrypt和$decrypt的字符串形式,可以用eval()来执行它们的代码内容。注意:eval有安全风险,一定要确保$encrypt/$decrypt的内容是完全可信的,避免注入攻击。
代码示例:
$lambda_functions[$code_hash] = function ( $action, &$self, $text ) use ( $encrypt, $decrypt ) { if ($action == "encrypt") { return eval($encrypt); // 若$encrypt是包含return的完整语句,直接执行即可 } else { return eval($decrypt); } };
办法2:重构为纯匿名函数(推荐,更安全)
这是更符合现代PHP规范的写法,彻底抛弃代码字符串,把$encrypt和$decrypt改成真正的匿名函数:
首先,把原来的代码字符串改成函数:
// 替换原来的字符串形式,直接写加密逻辑 $encryptFunc = function(&$self, $text) { return str_rot13($text); // 示例加密逻辑,按需替换 }; // 同理处理解密逻辑 $decryptFunc = function(&$self, $text) { return str_rot13($text); // 示例解密逻辑,按需替换 };
然后修改你的lambda函数:
$lambda_functions[$code_hash] = function ( $action, &$self, $text ) use ( $encryptFunc, $decryptFunc ) { if ($action == "encrypt") { return $encryptFunc($self, $text); } else { return $decryptFunc($self, $text); } };
这种方式完全避免了eval的安全隐患,代码可读性和可维护性也更高。
额外提醒
如果原来的$encrypt/$decrypt代码里依赖了$self变量,不管用哪种办法,都要确保$self在执行时是可用的——办法2里我们直接把$self作为参数传给了加密/解密函数,这样就没问题了。
内容的提问来源于stack exchange,提问作者3gth

