Я вижу эту ошибку только после обновления моей PHP-среды до PHP 5.4 и выше. Ошибка указывает на эту строку кода:
Ошибка:
Создание объекта по умолчанию из пустого значения
код:
$res->success = false;
Должен ли я сначала объявить объект $res?
Я вижу эту ошибку только после обновления моей PHP-среды до PHP 5.4 и выше. Ошибка указывает на эту строку кода:
Ошибка:
Создание объекта по умолчанию из пустого значения
код:
$res->success = false;
Должен ли я сначала объявить объект $res?
В вашей новой среде могут быть 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;
Это сообщение было 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);
Если вы поместите символ "@" в начале строки, тогда 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
Я использую этот трюк при разработке. Мне не нравится отключать все предупреждающие сообщения, потому что если вы не будете правильно обрабатывать предупреждения, они станут большой ошибкой в будущем.
Попробуйте это, если у вас есть массив и добавьте к нему объекты.
$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 из объектов для дальнейшего использования ~!
У меня была похожая проблема, и это, кажется, решило проблему. Вам просто нужно инициализировать объект $ res для класса. Предположим, что здесь имя класса test.
class test
{
//You can keep the class empty or declare your success variable here
}
$res = new test();
$res->success = false;
Эта проблема вызвана тем, что вы назначаете экземпляр объекта, который не инициирован. Например,
Ваш случай:
$user->email = '[email protected]';
Решение:
$user = new User;
$user->email = '[email protected]';
Простым способом получить эту ошибку является тип (a) ниже, что означает тип (b)
(a) $this->my->variable
(b) $this->my_variable
Тривиальный, но очень легко упускаемый и трудно различимый, если вы его не ищете.
Вам может потребоваться проверить, объявлена ли переменная и имеет правильный тип.
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.
У меня была похожая проблема при попытке добавить переменную к объекту, возвращенному из API. Я перебирал данные с помощью цикла foreach.
foreach ( $results as $data ) {
$data->direction = 0;
}
Это вызвало исключение "Создание объекта по умолчанию из пустого значения" в Laravel.
Я исправил это с очень маленьким изменением.
foreach ( $results as &$data ) {
$data->direction = 0;
}
Просто сделав $ data ссылкой.
Я надеюсь, что это помогает кому-то, это чертовски раздражает меня!
Я не очень хорошо разбираюсь в 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,
) );
Любая помощь приветствуется.
Благодарю вас.
нет, вы этого не сделаете.. он создаст его, когда вы добавите значение успеха объекту. Класс по умолчанию наследуется, если вы его не укажете.
Попробуйте использовать:
$user = (object) null;
Я поставил следующее в верхней части файла PHP с ошибкой, и ошибка больше не отображалась:
error_reporting(E_ERROR | E_PARSE);