该错误源于对ThinkPHP模型重载字段的非法间接修改,因__get()返回临时值而非引用,故$user['tags'][] = 'php'等操作会触发Indirect modification报错;正确做法是取→改→赋→存四步走。

这个错误根本不是 phpEnv 的问题,而是你代码里对 ThinkPHP 模型(或任意实现了 __get 的类)做了非法的间接修改。
为什么 $model['field'][] = 'x' 会报错
ThinkPHP 模型用数组方式访问字段(如 $user['name'])时,底层调用的是 __get() 魔法方法,它返回的是一个临时值(比如数组拷贝),不是原始属性的引用。你再对这个临时值做 []、[key] =、array_push() 等操作,PHP 就会抛出 Indirect modification of overloaded element。
- 错误写法:
$user['tags'][] = 'php'; - 错误写法:
$user['config']['level'] = 5; - 错误写法:
array_push($user['roles'], 'admin');
foreach 中带 & 引用时尤其危险
很多人在遍历模型数据时加了 &$v,以为能直接改原数据,但其实改的是 __get() 返回的临时数组副本,不仅无效,还触发报错。
- 错误写法:
foreach ($user['permissions'] as &$p) { $p['status'] = 1; } - 正确做法:先取出完整字段值,修改后整体赋回去:
$perms = $user['permissions']; $perms[] = ['id' => 123]; $user['permissions'] = $perms; - 更推荐用属性方式(如果字段是真实属性):
$user->permissions = $perms; $user->save();
模型数据要改就得「取→改→赋→存」四步走
ThinkPHP 不允许“就地修改”重载字段,必须显式赋值。漏掉任何一步都可能白忙活。
立即学习“PHP免费学习笔记(深入)”;
- 取:
$data = $model->toArray();或$field = $model['xxx']; - 改:
$field[] = 'new';或array_unshift($field, 'first'); - 赋:
$model['xxx'] = $field;或$model->xxx = $field; - 存:
$model->save();(仅当需要持久化到数据库时)
注意:$model->toArray() 返回的是普通数组,可以自由修改;但 $model['xxx'] 始终是受控的魔法访问,不能间接改。



















