PHP报错‘Creating default object from empty value’原因及解决(含代码)
问题分析与解决
报错原因
你遇到的“Creating default object from empty value”错误,核心是引用逻辑混乱导致的变量指向错误,具体流程如下:
- 第一次循环结束后,
$acc被赋值为$obj->reg(此时是指向null的引用),随后$obj = &$acc让$obj也指向这个null的引用。 - 第二次循环调用
_access时,虽然$obj被重新赋值为新的Registry实例,但执行$obj->reg = &$accessor时,$accessor是null的引用。PHP在处理对象属性的引用赋值时,若引用目标为null,会误判为你试图给未初始化的对象属性赋值,从而触发该报错。
同时,你的代码逻辑没有正确实现嵌套结构的构建:原本期望每个Registry的reg属性指向另一个Registry,但错误的引用赋值让reg属性变成了指向null的引用,而非实际的对象实例。
解决方法
方法1:修正原逻辑的引用问题
去掉不必要的引用赋值,明确构建嵌套对象的逻辑:
class Registry { public $reg = null; static function _access(&$obj, &$accessor = null) { if ($obj === null || !$obj instanceof Registry) { $obj = new Registry(); } // 让accessor指向当前对象的reg属性 $accessor = $obj->reg; // 若当前reg为null,创建新实例(为下一次循环准备嵌套对象) if ($obj->reg === null) { $obj->reg = new Registry(); } } } $reg = null; $obj = &$reg; $acc = null; for ($i=0; $i<3;++$i) { Registry::_access($obj, $acc); $obj = &$acc; } // 将最内层的reg设为null,符合预期结构 $obj->reg = null; var_dump($reg);
方法2:简化逻辑直接构建嵌套结构
如果不需要保留原有的_access方法逻辑,直接循环创建嵌套对象会更清晰:
class Registry { public $reg = null; } $reg = new Registry(); $current = $reg; // 循环2次创建两层嵌套,加上最外层共3层结构 for ($i = 0; $i < 2; $i++) { $current->reg = new Registry(); $current = $current->reg; } // 最内层reg保持null var_dump($reg);
两种方法最终都会生成预期的嵌套结构:Registry -> Registry -> Registry -> null。
内容的提问来源于stack exchange,提问作者rhavin
相关产品推荐
相关产品推荐

