You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修复PHP中的‘Trying to get property of non-object’与‘Creating default object from empty value’报错

如何修复PHP中的‘Trying to get property of non-object’与‘Creating default object from empty value’报错

嗨,我来帮你搞定这两个PHP报错~咱们先拆解下问题根源,再一步步修复:

错误根源分析

  1. Line 11的Trying to get property of non-object提示
    这个报错说明你在访问$last->day时,$last并不是一个合法的对象——它可能是null、数组,或者根本没被初始化。PHP没法从非对象里读取属性,所以抛出这个提示。

  2. Line 13的Creating default object from empty value警告
    $last是空值(比如null)的时候,你直接给$last->time赋值,PHP会自动帮你创建一个默认的stdClass对象,但这种“隐式创建”是不规范的,尤其是在PHP的严格模式下,就会触发这个警告。

具体修复方案

问题的核心是要确保$last始终是一个有效的对象,我们需要在使用它之前做初始化和检查:

第一步:确保$last被正确初始化

首先,你肯定是从last.json文件读取的$last数据,所以在读取解析的时候就要处理空文件/无效内容的情况:

// 读取JSON文件内容
$lastFile = $GLOBALS['folder'] . 'data/last.json';
$lastData = file_exists($lastFile) ? file_get_contents($lastFile) : '';

// 解析为对象,如果解析失败(比如文件为空、格式错误),就创建一个默认对象
$last = json_decode($lastData);
if (!is_object($last)) {
    $last = new stdClass();
    // 给必要的属性设置默认值,避免后续访问时报错
    $last->day = 0; // 或者符合你业务逻辑的默认值,比如昨天的日期
    $last->time = time(); // 或者合适的默认时间戳
}

第二步:在使用前增加安全检查

修改你原有的判断逻辑,确保访问$last->day是安全的:

// 先检查$last是对象,并且存在day属性,再做数值比较
if (is_object($last) && property_exists($last, 'day') && $today > $last->day) {
    // 此时$last已经是合法对象,赋值不会再触发警告
    $last->time = $now;
    $last->day = $today;
    
    file_put_contents($GLOBALS['folder'] . 'data/last.json', json_encode($last));
    
    $repository = new Repository();
    $repository->openConnection();
    self::processDay($repository);
    self::processList($repository);
    $repository->closeConnection();
    
    return;
}

为什么这样能解决问题?

  • 初始化步骤保证了无论JSON文件是否存在、内容是否有效,$last都会是一个stdClass对象,从根源上避免了“非对象”的问题。
  • 增加的is_object($last)property_exists($last, 'day')检查,确保你访问$last->day时不会踩坑。
  • 因为$last已经是合法对象,给$last->time赋值时就不会触发“创建默认对象”的警告了。

备注:内容来源于stack exchange,提问作者Ahmet Can Demirbaş

火山引擎 最新活动