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

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

Ошибка:

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

Код:

$res->success = false;

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

18 ответов

Решение

Ваша новая среда может иметь E_STRICT предупреждения включены вerror_reporting для версий PHP <= 5.3.x, или просто 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;

Это сообщение было 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)

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

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

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

$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.
}

Это отправляет массив объектов для дальнейшего использования ~!

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

ini_set('error_reporting', E_STRICT);

В PHP 7 анонимные объекты могут быть созданы следующим образом:

$res = new class {
    public $success = false;
};

https://www.php.net/manual/en/language.oop5.anonymous.phphttp://sandbox.onlinephpfunctions.com/code/ab774707a8219c0f35bdba49cc84228b580b52ee

  1. Сначала подумайте, что вам следует создать объект $res = new \stdClass();

  2. затем присвойте объекту ключ и значение $res->success = false;

Начиная с PHP 7 вы можете использовать оператор объединения null для создания объекта, когда переменная имеет значение null.

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

Простой способ получить эту ошибку - напечатать (a) ниже, то есть напечатать (b)

(а) $this->my->variable

(б) $this->my_variable

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

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

class test
{
   //You can keep the class empty or declare your success variable here
}
$res = new test();
$res->success = false;

Это предупреждение, с которым я столкнулся в PHP 7, простое решение - инициализировать переменную перед ее использованием.

$myObj=new \stdClass();

После того, как вы инициализировали его, вы можете использовать его для объектов

 $myObj->mesg ="Welcome back - ".$c_user;

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

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

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

Я исправил это с очень маленьким изменением.

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

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

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

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

$user = (object) null;

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

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 анонимные классы.

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

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

Ваш случай:

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

Решение:

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

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

error_reporting(E_ERROR | E_PARSE);
Другие вопросы по тегам