我正在將 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 ;
}
}
}
提前致謝。
uj5u.com熱心網友回復:
您不能只在非物件上分配屬性。這在 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 中,警告級別仍然可以繼續行程
而在 PHP 8.0 中,這變為錯誤級別并將停止行程。
如果您顯示所有錯誤或記錄所有錯誤級別,您將看到這不僅僅發生在 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
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/391091.html
