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

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

Ошибка:

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

код:

$res->success = false;

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

Ответ 1

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

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

Ответ 2

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

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

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

$res->success = false;

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

Ответ 3

Просто,

    $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

Попробуйте следующее:

ini_set('error_reporting', E_STRICT);

Ответ 5

Если вы поместите символ "@" в начале строки, тогда 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 default value is 0.
$unknownVar[$someStringVariable]->totalcall += 10; // you don't need to @ character anymore.
echo $unknownVar[$someStringVariable]->totalcall; // 20

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

Ваш случай:

$user->email = '[email protected]';

Решение:

$user = new User;
$user->email = '[email protected]';

Ответ 9

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

(a) $this->my->variable

(b) $this->my_variable

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

Ответ 10

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

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.

Ответ 11

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

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

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

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

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

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

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

Ответ 12

Я не очень хорошо разбираюсь в php и хотел знать, не могли бы вы помочь мне решить эту проблему?

Вот сообщение об ошибке:

[01-Jul-2019 09:37:29 UTC] Предупреждение PHP: Создание объекта по умолчанию из пустого значения в /home/surreytr/public_html/.co.uk/wp-content/themes/graftingardeners/inc/customizer.php on line 421 [01-Jul-2019 09:37:29 UTC] Предупреждение PHP: Создание объекта по умолчанию из пустого значения в /home/surreytr/public_html/graftingardeners.co.uk/wp-content/themes/graftingardeners/inc/customizer.php на линии 422 [01-Jul-2019 09:37:29 UTC] Предупреждение PHP: Создание объекта по умолчанию из пустого значения в /home/surreytr/public_html/graftingardeners.co.uk/wp-content/themes/graftingardeners/inc/customizer.php на линии 423

Вот код:

// Navigation
$wp_customize->get_section( 'nav' )->priority  = 60;
$wp_customize->get_control( 'nav_menu_locations[header]' )->priority  = 20;
$wp_customize->get_control( 'nav_menu_locations[footer]' )->priority  = 30;
$wp_customize->add_setting( 'GG_hide_navigation', array(
    'default'           => '',
    'sanitize_callback' => 'GG_sanitize_checkbox',
) );
$wp_customize->add_control( 'GG_hide_navigation', array(
    'label'    => __( 'Hide Navigation Bar', 'GG' ),
    'section'  => 'nav',
    'type'     => 'checkbox',
    'priority' => 11,
) );
$wp_customize->add_setting( 'GG_hide_search', array(
    'default'           => '',
    'sanitize_callback' => 'GG_sanitize_checkbox',
) );
$wp_customize->add_control( 'GG_hide_search', array(
    'label'    => __( 'Hide Search', 'GG' ),
    'section'  => 'nav',
    'type'     => 'checkbox',
    'priority' => 12,
) );

Любая помощь приветствуется.

Благодарю вас.

Ответ 13

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

Ответ 14

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

$user = (object) null;

Ответ 15

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

error_reporting(E_ERROR | E_PARSE);