CodeIgniter3中返回引用的方法无法修改关联多维数组问题
问题分析与解决方案:返回引用的方法无法修改数组的原因及修复
问题原因
你定义的items()方法里,$list是局部临时变量——无论是直接赋值$this->data还是json_decode的结果,它都只存在于方法执行期间。虽然你返回了$list['items']的引用,但方法执行完毕后,局部变量$list会被PHP垃圾回收机制销毁,此时返回的引用指向的是一个已被回收的临时数组元素。后续对这个引用的修改,完全不会关联到$this->data,自然看不到任何修改效果。
修复方法
要让返回的引用真正关联到对象的$data属性,需要直接操作$this->data,去掉局部变量的中转。修改后的items()方法如下:
/** * Function : items * Target : Retrieves a reference to the items, decoded * * @author : Angev * @since : 2.0 * @version : 1.0 * * @return Referenced link to index 'items'. */ public function &items() { // 先确保$this->data是数组格式(如果原本是JSON字符串的话) if (!is_array($this->data)) { $this->data = json_decode($this->data, true); } // 直接返回$this->data['items']的引用,和对象属性绑定 return $this->data['items']; }
修改完成后,你原本的调用代码$this->items()[$uid] = [...]就能正常工作了——此时操作的是$this->data['items']的直接引用,修改会实时同步到$this->data中,后续调用$this->items()就能看到新增的元素。
补充说明:之前出现的can't use method return value in write context错误,是PHP 5.4之前的版本不支持直接对方法返回的数组做赋值操作导致的,你的运行环境应该是PHP 5.4+,所以该错误不再出现,但引用逻辑的缺陷导致了修改不生效的问题。
内容的提问来源于stack exchange,提问作者Kay Angevare
相关产品推荐
相关产品推荐

