Відповіді:
У вашому новому середовищі можуть бути включеніE_STRICT попередження для PHP версій <= 5.3.x, або просто встановлено принаймні для PHP версій> = 5.4. Ця помилка спрацьовує, коли вона ще не ініціалізована:error_reportingerror_reportingE_WARNING$resNULL
$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 до класу. Припустимо, тут назва класу - тест.
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
(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;
}
Просто зробивши $ дані посиланням.
Я сподіваюся, що хтось допомагає, це дратувало пекло від мене!
Спочатку подумайте, що вам слід створити об’єкт $ res = new \ stdClass ();
потім призначте об'єкт з ключем і значенням, ніж $ res-> success = false;
thay.) Якщо потрібно розрив рядка після деякого вмісту, додайте два порожні пробіли до видимого вмісту рядка перед початком прориву.
ні, ви цього не робите .. він створить його, коли ви додасте до об'єкта значення успіху. Клас за замовчуванням успадковується, якщо його не вказати.
Спробуйте використовувати:
$user = (object) null;
$res?