【问题标题】:After upgrade php version to 8, this error display将php版本升级到8后,显示此错误
【发布时间】:2022-01-24 08:28:42
【问题描述】:

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

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

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

遇到未捕获的异常类型:错误

消息:尝试在 null 上分配属性“child”

详细代码:-

$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++;
            }
        }
    }

提前致谢。

【问题讨论】:

  • 这意味着$child_parent['parent'][$resultData-&gt;parent_id]null 并且您正在尝试访问null 上的child 属性。转到上一步检查它为什么为空。
  • 你应该检查你的 $child_parent['parent'] 数组,然后检查 $resultData->parent_id 的值,因为 $child_parent['parent'][$resultData->parent_id] 评估为 NULL,并尝试在 NULL 上分配属性已经是 php7 中的错误。
  • 在 php7 中,此代码工作正常: $child_parent['parent'][$resultData->parent_id]->child = 'Yes';它回显“是”。在 php 8 中,它给出了错误。
  • 它可能之前给出了警告,而不是错误。 PHP 8 更加严格,让做傻事变得更加困难。同样,解决方案是找出它为空的原因并修复错误
  • 是的,我已经解释了为什么它工作“很好”......因为实际上它可能没有,它只是没有崩溃。无论是那个还是问题都与您的升级无关,实际上只是一些不同的数据导致了它。无论哪种方式,您都需要对其进行调试和修复。这是底线。我们无法告诉您为什么它为空,因为我们没有您的所有数据或所有相关代码

标签: php codeigniter php-8


【解决方案1】:

您不能只在非对象上分配属性。 这在 PHP 7 上也会出错,而不仅仅是 8。

例如:

$arr = [];

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

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

警告:从空值创建默认对象

PHP 8.0+ 上的结果:

错误:尝试在 null 上分配属性“child”

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

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

$arr = [];

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

在您的情况下,$child_parent['parent'][$resultData-&gt;ModuleID]$child_parent['parent'][$resultData-&gt;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
}

【讨论】:

  • 我还添加了 $arr['parent'][1]->open_child = 'yes';和 $child_parent['parent'][$resultData->parent_id] = new \stdClass();您的代码正在运行。谢谢@vee。
  • 您不必使用$arr['parent'][1]。我只是为了示例编写此代码。请阅读我的描述,已经解释过了。
猜你喜欢
  • 2015-12-12
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 2018-01-03
  • 2020-08-26
  • 2022-10-13
相关资源
最近更新 更多