将php版本升级到8后,出现这个错误

After upgrade php version to 8, this error display

我正在将 php 7 升级到 php 8.0。在之前的 php 版本 7 中,这段代码工作正常。

$child_parent['parent'][$resultData->parent_id]->child = 'Yes';

以上代码在 php 7 中运行良好。现在我正在升级 php 8.0 版。在这个新版本中它给出了这个错误。

An uncaught Exception was encountered Type: Error

Message: Attempt to assign property "child" on null

详细代码:-

$currentFile = $_SERVER["REQUEST_URI"];
    $parts = Explode('/', $currentFile);

    $currnet_menu = $parts[count($parts) - 1];

    $child_parent = array();
    $parent = array();
    $new_array = array();
    $increment = 0;
foreach ($menu_data as $key => $resultData) {
        //echo"<pre>";print_r($resultData); 
            //stdClass Object //output of $resultData
            //(
            //    [key_id] => 67
            //    [key_update_date] => 
            //    [key_update_by] => 
            //    [GroupModuleID] => 67
            //    [ModuleID] => 38
            //    [GroupId] => 1
            //    [ModuleName] => home
            //    [display_name] => Home Page
            //    [super_use] => 0
            //    [Mid] => 38
            //    [description] => 
            //   [parent_id] => 0
            //    [display_in_menu] => 1
            //    [module_icon] => home
            //    [groupName] => Super Admin
            //    [Uid] => 119
            //    [icon_html] => 
            //    [total_count] => 0
            //    [has_more_records] => 0
            )
        if ($resultData->display_in_menu == 1) {
            array_push($parent, $resultData->parent_id);
            if (in_array($resultData->parent_id, $parent)) {
                if ($resultData->parent_id == 0) {
                    $child_parent['parent'][$resultData->ModuleID] = $resultData;
                    $child_parent['parent'][$resultData->ModuleID]->child = 'No';
                } else {
                    $child_parent['child'][$resultData->parent_id][$increment] = $resultData;
                    $child_parent['parent'][$resultData->parent_id]->child = 'Yes';

                    $parts1 = Explode('/', $resultData->ModuleName);
                    $currnet_menu_check = $parts1[count($parts1) - 1];

                    if ($currnet_menu_check == $currnet_menu) {
                        $new_array[$resultData->parent_id]->open_child = 'Yes';
                    }
                }
                $increment++;
            }
        }
    }

提前致谢。

您不能只对非对象分配 属性。 这也在 PHP 7 而不仅仅是 8.

上出错

例如:

$arr = [];

$arr['parent'][1]->child = 'yes';

我试图在非对象上分配 child 属性。 $arr['parent'][1] 是空的,不是对象。
PHP 7.0 - 7.4 的结果:

Warning: Creating default object from empty value

PHP 8.0+ 上的结果:

Error: Attempt to assign property "child" on null

PHP 7.0+ 和 PHP 8.0+ 之间的区别是...
在PHP7.0+中,警告级别仍然可以继续处理
而在 PHP 8.0+ 中,这变成了 Error 级别并且将停止进程。
如果您显示所有错误或记录所有错误级别,您会发现这不仅发生在 PHP 8.0+ 上。

要使其工作(分配 属性),您的变量必须是对象。在我的示例中,$arr['parent'][1] 必须是对象。

$arr = [];

$arr['parent'][1] = new \stdClass();
$arr['parent'][1]->child = 'yes';

在您的情况下,$child_parent['parent'][$resultData->ModuleID]$child_parent['parent'][$resultData->parent_id] 都需要在分配 属性 之前声明为对象。

if ($resultData->parent_id == 0) {
    $child_parent['parent'][$resultData->ModuleID] = $resultData;// I think $resultData is already an object.
    $child_parent['parent'][$resultData->ModuleID]->child = 'No';
} else {
    $child_parent['child'][$resultData->parent_id][$increment] = $resultData;
    $child_parent['parent'][$resultData->parent_id] = new \stdClass();// added
    $child_parent['parent'][$resultData->parent_id]->child = 'Yes';

    // your code
}