PHP 8.0 类型错误:深入理解与解决“尝试在 null 上赋值属性”的问题

admin 百科 8

PHP 8.0 类型错误:深入理解与解决“尝试在 null 上赋值属性”的问题-第1张图片-佛山资讯网

本文旨在深入探讨从 PHP 7 升级到 PHP 8.0 后,因“Attempt to assign property "child" on null”错误而导致的应用程序中断问题。我们将分析 PHP 7 和 PHP 8 在处理对非对象变量赋值属性时的行为差异,解释错误产生的根本原因,并提供通过显式对象初始化来解决此类问题的具体方法和最佳实践。

在 PHP 开发中,随着语言版本的迭代,一些看似微小的行为变化可能会在升级后引发意想不到的错误。其中,从 PHP 7 升级到 PHP 8.0 时,一个常见的陷阱是尝试对非对象(尤其是 null 值)赋值属性时,程序行为从可继续的警告变为致命错误。本文将详细解析这一变化及其解决方案。

PHP 7 与 PHP 8 在属性赋值上的行为差异

在 PHP 7.x 版本中,当你尝试对一个未初始化或为 null 的变量(预期为对象)的属性进行赋值操作时,PHP 会发出一个 E_WARNING 级别的警告信息:“Warning: Creating default object from empty value”(从空值创建默认对象)。尽管有警告,PHP 运行时通常会尝试将该空值隐式转换为一个 stdClass 对象,然后完成属性赋值,程序流程得以继续。

考虑以下 PHP 7.x 代码示例:

立即学习“PHP免费学习笔记(深入)”;

<?php
$arr = [];
// 尝试对一个不存在的数组元素(它既不是对象也不是数组)的属性进行赋值
$arr['parent'][1]->child = 'yes'; 
var_dump($arr);
?>

登录后复制

在 PHP 7.0 到 7.4 中运行上述代码,你将得到类似如下的输出:

Warning: Creating default object from empty value in /path/to/your/script.php on line 4
array(1) {
  ["parent"]=>
  array(2) {
    [0]=>
    NULL
    [1]=>
    object(stdClass)#1 (1) {
      ["child"]=>
      string(3) "yes"
    }
  }
}

登录后复制

可以看到,尽管有警告,$arr['parent'][1] 最终被转换为一个 stdClass 对象,并成功赋上了 child 属性。

然而,在 PHP 8.0 及更高版本中,这种隐式转换行为被取消,并且对 null 值尝试赋值属性被提升为 Error 级别。这意味着当遇到此类操作时,程序将立即停止执行,并抛出致命错误:“Error: Attempt to assign property "child" on null”(尝试在 null 上赋值属性)。

同样的 PHP 8.0+ 代码示例:

<?php
$arr = [];
// 尝试对一个不存在的数组元素(它既不是对象也不是数组)的属性进行赋值
$arr['parent'][1]->child = 'yes'; 
var_dump($arr);
?>

登录后复制

在 PHP 8.0+ 中运行上述代码,程序将抛出致命错误并终止:

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~