PHP7.4.2升级到8.1.2后出现Attempt to assign property "status" on null报错求助
PHP 8.1 赋值对象属性报错的原因与修复方案
问题关联的PHP 8特性变更
这个错误完全和PHP 8的特性变更有关:PHP 8.0及以上版本禁止给null值动态赋值对象属性。在PHP 7及更早版本中,如果变量未初始化(值为null),尝试给它赋值对象属性时,PHP会自动隐式创建一个stdClass实例;但PHP 8.0起,这个隐式行为被移除,直接抛出Attempt to assign property on null的致命错误。
你的代码中,循环内的$myObj没有提前初始化,第一次进入循环时$myObj是null,PHP 8.1会直接报错。
代码修复方案
只需要在循环内部、给属性赋值前,显式初始化$myObj为stdClass对象即可:
if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { $myObj = new stdClass(); // 显式初始化对象 $myObj->status = '1'; $myObj->video = $row["token"]; $title = str_replace(".mp4","",$row["filename"]); $myObj->title = $title; // 这里可添加后续逻辑,比如将$myObj存入数组或输出等 } }
如果你的需求是将多个对象收集到数组中,还需要提前初始化目标数组:
$videoList = []; // 初始化存储对象的数组 if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { $myObj = new stdClass(); $myObj->status = '1'; $myObj->video = $row["token"]; $title = str_replace(".mp4","",$row["filename"]); $myObj->title = $title; $videoList[] = $myObj; // 将对象加入数组 } }
补充说明
PHP 8的这个变更属于类型严格性增强的一部分,目的是避免隐式创建对象带来的意外逻辑问题,让代码的行为更清晰可控,符合现代编程语言的类型规范。
内容的提问来源于stack exchange,提问作者Paul Mark
相关产品推荐
相关产品推荐

