Создание объекта по умолчанию из пустого значения в PHP?

Я вижу эту ошибку только после обновления моей PHP-среды до PHP 5.4 и выше. Ошибка указывает на эту строку кода:

Ошибка:

Создание объекта по умолчанию из пустого значения

Код:

$res->success = false; 

Должен ли я сначала объявить объект $res ?

Solutions Collecting From Web of "Создание объекта по умолчанию из пустого значения в PHP?"

В вашей новой среде могут быть E_STRICT предупреждения E_STRICT в error_reporting если это PHP <= 5.3, или просто установите error_reporting как минимум E_WARNING с PHP 5.4+. , Эта ошибка срабатывает, когда $res равно NULL или еще не инициализирован:

 $res = NULL; $res->success = false; // Warning: Creating default object from empty value 

PHP сообщит о другом сообщении об ошибке, если $res уже инициализирован некоторым значением, но не является объектом:

 $res = 33; $res->success = false; // Warning: Attempt to assign property of non-object 

Чтобы соответствовать стандартам E_STRICT до PHP 5.4 или нормальному E_WARNING ошибки E_WARNING в PHP> = 5.4, предполагая, что вы пытаетесь создать общий объект и назначить success свойства, вам нужно объявить $res как объект stdClass в глобальном пространстве имен:

 $res = new \stdClass(); $res->success = false; 

Это сообщение было E_STRICT для PHP <= 5.3. Начиная с PHP 5.4, это было неоправданно изменено на E_WARNING . Поскольку сообщения E_WARNING полезны, вы не хотите полностью их отключать.

Чтобы избавиться от этого предупреждения, вы должны использовать этот код:

 if (!isset($res)) $res = new stdClass(); $res->success = false; 

Это полностью эквивалентная замена . Он обеспечивает точно то же самое, что PHP делает незаметно – к сожалению, с предупреждением теперь – неявное создание объекта. Вы всегда должны проверить, существует ли объект, если вы не уверены, что он этого не делает. Код, предоставленный Майклом, вообще не хорош, поскольку в некоторых контекстах объект иногда может быть определен в одном месте в коде, в зависимости от обстоятельств.

Просто,

  $res = (object)array("success"=>false); // $res->success = bool(false); 

или

  $res = (object)array(); // object(stdClass) $res = new stdClass(); // old method 

а также

  $res->success = !!0; // bool(false) $res->success = false; // bool(false) $res->success = (bool)0; // bool(false) 

Попробуй это:

 ini_set('error_reporting', E_STRICT); 

Попробуйте это, если у вас есть массив и добавить к нему объекты.

 $product_details = array(); foreach ($products_in_store as $key => $objects) { $product_details[$key] = new stdClass(); //the magic $product_details[$key]->product_id = $objects->id; //see new object member created on the fly without warning. } 

Это отправляет ARRAY объектов для последующего использования ~!

Простым способом получить эту ошибку является тип (a) ниже, что означает тип (b)

(a) $this->my->variable

(b) $this->my_variable

Тривиальный, но очень легко упускаемый и трудно различимый, если вы его не ищете.

Эта проблема вызвана тем, что вы назначаете экземпляр объекта, который не инициирован. Например:

Ваш случай:

 $user->email = 'exy@gmail.com'; 

Решение:

 $user = new User; $user->email = 'exy@gmail.com'; 

Если вы поместите символ «@» в начале строки, то PHP не покажет никаких предупреждений / уведомлений для этой строки. Например:

 $unknownVar[$someStringVariable]->totalcall = 10; // shows a warning message that contains: Creating default object from empty value 

Чтобы предотвратить это предупреждение для этой строки, вы должны поместить символ «@» в строку следующим образом:

 @$unknownVar[$someStringVariable]->totalcall += 10; // no problem. created a stdClass object that name is $unknownVar[$someStringVariable] and created a properti that name is totalcall, and it's default value is 0. $unknownVar[$someStringVariable]->totalcall += 10; // you don't need to @ character anymore. echo $unknownVar[$someStringVariable]->totalcall; // 20 

Я использую этот трюк при разработке. Мне не нравится отключать все предупреждающие сообщения, потому что если вы не будете правильно обрабатывать предупреждения, они станут большой ошибкой в ​​будущем.

Вам может потребоваться проверить, объявлена ​​ли переменная и имеет ли она правильный тип.

 if (!isset($res) || !is_object($res)) { $res = new \stdClass(); // With php7 you also can create an object in several ways. // Object that implements some interface. $res = new class implements MyInterface {}; // Object that extends some object. $res = new class extends MyClass {}; } $res->success = true; 

См. Анонимные классы PHP .

нет, вы этого не сделаете .. он создаст его, когда вы добавите значение успеха объекту. Класс по умолчанию наследуется, если вы его не укажете.

Я поставил следующее в верхней части файла PHP с ошибкой, и ошибка больше не отображалась:

 error_reporting(E_ERROR | E_PARSE);