如何修复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报错~咱们先拆解下问题根源,再一步步修复:
错误根源分析
Line 11的
Trying to get property of non-object提示
这个报错说明你在访问$last->day时,$last并不是一个合法的对象——它可能是null、数组,或者根本没被初始化。PHP没法从非对象里读取属性,所以抛出这个提示。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ş




