Ответы:
В вашей новой среде могут быть включеныE_STRICT
предупреждения для версий PHP <= 5.3.x или просто установлено значение по крайней мере для версий PHP> = 5.4. Эта ошибка срабатывает , когда есть или еще не инициализированы:error_reporting
error_reporting
E_WARNING
$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;
if (!isset($res)) $res = new stdClass();
. В противном случае этот код не является эквивалентной заменой неявного создания объекта «старый PHP».
Это сообщение было E_STRICT
для PHP <= 5.3. Начиная с PHP 5.4, он был неудачно изменен на E_WARNING
. Поскольку E_WARNING
сообщения полезны, вы не хотите полностью их отключать.
Чтобы избавиться от этого предупреждения, вы должны использовать этот код:
if (!isset($res))
$res = new stdClass();
$res->success = false;
Это полностью эквивалентная замена . Это гарантирует то же самое, что PHP делает тихо - к сожалению, теперь с предупреждением - неявное создание объекта. Вы должны всегда проверять, существует ли объект уже, если вы не уверены, что это не так. Код, предоставленный Майклом, в целом не годится, потому что в некоторых контекстах объект может иногда уже определяться в одном и том же месте кода, в зависимости от обстоятельств.
Undefined variable: res
.
Просто,
$res = (object)array("success"=>false); // $res->success = bool(false);
Или вы можете создавать экземпляры классов с помощью:
$res = (object)array(); // object(stdClass) -> recommended
$res = (object)[]; // object(stdClass) -> works too
$res = new \stdClass(); // object(stdClass) -> old method
и заполните значения:
$res->success = !!0; // bool(false)
$res->success = false; // bool(false)
$res->success = (bool)0; // bool(false)
Дополнительная информация: https://www.php.net/manual/en/language.types.object.php#language.types.object.casting
$this->route->uri = new stdClass();
не работает для меня, у меня все еще есть предупреждение. Примечание: $this->route
существует.
Если вы вставите символ «@» в начале строки, тогда 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.
}
Это посылает ARRAY из объектов для дальнейшего использования ~!
Попробуй это:
ini_set('error_reporting', E_STRICT);
E_STRICT
ошибках, кроме ошибок, включая подавление сообщений о фатальных ошибках. Это не разумное предложение, чтобы решить это конкретное предупреждение, и, более того, это то, что вы почти никогда не хотите делать. Почему 5 человек проголосовали за это, я понятия не имею.
ini_set('error_reporting', -1);
при отладке, но не используйте вышеизложенное, как никогда.
У меня была похожая проблема, и это, кажется, решило проблему. Вам просто нужно инициализировать объект $ 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;
Эта проблема вызвана тем, что вы присваиваете экземпляр объекта, который не инициирован. Например:
Ваш случай:
$user->email = 'exy@gmail.com';
Решение:
$user = new User;
$user->email = 'exy@gmail.com';
Простой способ получить эту ошибку - напечатать (a) ниже, то есть напечатать (b)
(А) $this->my->variable
(Б) $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 ссылкой.
Я надеюсь, что это поможет кому-то, это чертовски раздражает меня!
Сначала подумайте, что вы должны создать объект $ res = new \ stdClass ();
затем назначьте объект с ключом и значением thay $ res-> success = false;
thay
.) Если вы хотите разрыв строки после некоторого содержимого, добавьте два пробела к видимому содержимому строки перед переходом в будущее.
нет, вы не .. он создаст его, когда вы добавите в объект значение успеха. класс по умолчанию наследуется, если вы его не указали.
Попробуйте использовать:
$user = (object) null;
$res
?