Создание объекта по умолчанию из пустого значения в PHP? - PullRequest
325 голосов
/ 17 января 2012

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

Ошибка:

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

Код:

$res->success = false;

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

Ответы [ 14 ]

556 голосов
/ 17 января 2012

В вашей новой среде могут быть включены E_STRICT предупреждения в error_reporting для версий PHP <= 5.3.x или просто для <code>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 ошибки в PHP> = 5.4, при условии, что вы пытаетесь создать универсальный объект и назначить свойство success, вам необходимо объявить $res как объект stdClass в глобальном пространстве имен:

$res = new \stdClass();
$res->success = false;
47 голосов
/ 09 января 2014

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

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

if (!isset($res)) 
    $res = new stdClass();

$res->success = false;

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

9 голосов
/ 17 января 2016

Просто

    $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)
4 голосов
/ 04 июля 2017

Если вы вставите символ «@» в начале строки, тогда 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

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

2 голосов
/ 12 июня 2015

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

$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 из Объектов для последующего использования ~!

2 голосов
/ 05 сентября 2013

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

ini_set('error_reporting', E_STRICT);
1 голос
/ 06 августа 2018

У меня была похожая проблема, и это, похоже, решило проблему.Вам просто нужно инициализировать объект $ res для класса.Предположим, что здесь имя класса test.

class test
{
   //You can keep the class empty or declare your success variable here
}
$res = new test();
$res->success = false;
0 голосов
/ 14 марта 2019

У меня была похожая проблема при попытке добавить переменную к объекту, возвращенному из API.Я перебирал данные с помощью цикла foreach.

foreach ( $results as $data ) {
    $data->direction = 0;
}

Это вызвало исключение "Создание объекта по умолчанию из пустого значения" в Laravel.

Я исправил его с очень небольшим изменением.

foreach ( $results as &$data ) {
    $data->direction = 0;
}

Просто сделав ссылку на $ data.

Я надеюсь, что это кому-нибудь поможет, это чертовски раздражает меня!

0 голосов
/ 09 ноября 2018

Попробуйте использовать:

$user = (object) null;
0 голосов
/ 15 ноября 2017

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

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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...