You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP报错‘Creating default object from empty value’原因及解决(含代码)

问题分析与解决

报错原因

你遇到的“Creating default object from empty value”错误,核心是引用逻辑混乱导致的变量指向错误,具体流程如下:

  1. 第一次循环结束后,$acc被赋值为$obj->reg(此时是指向null的引用),随后$obj = &$acc让$obj也指向这个null的引用。
  2. 第二次循环调用_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:29:59