Estoy actualizando php 7 a php 8.0. En la versión anterior de php 7, este código funcionaba bien.
$child_parent['parent'][$resultData->parent_id]->child = 'Yes';Este código anterior funciona bien en php 7. Ahora estoy actualizando la versión 8.0 de php. En esta nueva versión da este error.
Se encontró una excepción no detectada Tipo: Error
Mensaje: Intento de asignar propiedad "hijo" en nulo
código con detalles: -
$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++; } } }Gracias por adelantado.
No puede simplemente asignar propiedades en no objetos. Esto también falla en PHP 7, no solo en 8.
Por ejemplo:
$arr = []; $arr['parent'][1]->child = 'yes'; Estoy tratando de asignar una propiedad child a un objeto que no sea. El $arr['parent'][1] está vacío, no es un objeto.
El resultado en PHP 7.0 - 7.4:
Advertencia: creación de un objeto predeterminado a partir de un valor vacío
El resultado en PHP 8.0+:
Error: intento de asignar la propiedad "hijo" en nulo
La diferencia entre PHP 7.0+ y PHP 8.0+ es...
En PHP7.0+, el nivel de Advertencia aún puede continuar el proceso
Mientras que en PHP 8.0+ esto se convierte en el nivel de Error y se detendrá el proceso.
Si muestra todos los errores o registra todos los niveles de error, verá que esto no solo sucede en PHP 8.0+.
Para que funcione (para asignar propiedades), su variable debe ser un objeto. En mi ejemplo, $arr['parent'][1] debe ser un objeto.
$arr = []; $arr['parent'][1] = new \stdClass(); $arr['parent'][1]->child = 'yes'; En su caso, tanto $child_parent['parent'][$resultData->ModuleID] como $child_parent['parent'][$resultData->parent_id] debían declararse como un objeto antes de asignar la propiedad.
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 }