类方法调用序列化匿名函数报“方法名必须是字符串”错误
问题分析与解决方案
错误原因
你遇到的Method name must be a string错误,根源在于JSON无法序列化函数类型。当代码执行json_encode($arr)时,数组中的匿名函数会被转换为null,后续json_decode还原数组后,原本存储匿名函数的$value['b']就变成了null。此时尝试把null当作函数调用,PHP就会抛出该错误。
解决办法
1. 移除不必要的JSON序列化操作
如果这个JSON编码/解码步骤不是业务必须的,直接删除相关代码,保持原数组的结构,匿名函数就能正常调用——你的原始代码本身是可以正常运行的。
2. 改用PHP原生序列化(若必须序列化)
如果需要序列化存储包含匿名函数的数组,放弃JSON,使用PHP原生的serialize()和unserialize()——它们支持闭包的序列化(要求PHP 7.4+,若闭包引用外部变量需额外处理):
// 序列化数组 $serializedData = serialize($arr); // 反序列化还原 $restoredArr = unserialize($serializedData);
3. 重构逻辑:分离函数与可序列化数组
如果JSON序列化是必须的(比如要传递给前端),不能在数组中直接存储函数,需将函数逻辑与数组分离:
class MyClass { // 单独存储处理函数 private $funcHandlers = [ 'type_c' => function($i) { return 'c' . $i; }, 'type_d' => function($i) { return 'd' . $i; } ]; public function my_arr($options = array()) { $arr = array( '1' => array( 'a' => 'z', 'b' => 'type_c' // 用标识代替函数 ), '2' => array( 'a' => 'y', 'b' => 'type_d' ), ); // 此时可以安全执行JSON序列化/反序列化 $encoded = json_encode($arr); $decoded = json_decode($encoded, true); return $decoded; } public function do_loop() { $my_arr = $this->my_arr(); $i = 0; foreach($my_arr as $key => $value){ // 通过标识匹配对应的函数 $handler = $this->funcHandlers[$value['b']]; echo $handler($i) . '<br>'; $i++; } } } (new MyClass())->do_loop();
内容的提问来源于stack exchange,提问作者Ryan Dorn
相关产品推荐
相关产品推荐

