Odpowiedzi:
W nowym środowisku może być włączoneE_STRICT
ostrzeżenia dla wersji PHP <= 5.3.x lub po prostu ustawione na przynajmniej wersje PHP> = 5.4. Ten błąd jest wyzwalany, gdy jest lub nie jest jeszcze zainicjowany:error_reporting
error_reporting
E_WARNING
$res
NULL
$res = NULL;
$res->success = false; // Warning: Creating default object from empty value
PHP zgłosi inny komunikat o błędzie, jeśli $res
jest już zainicjowany na jakąś wartość, ale nie jest obiektem:
$res = 33;
$res->success = false; // Warning: Attempt to assign property of non-object
Aby zachować zgodność ze E_STRICT
standardami wcześniejszymi niż PHP 5.4 lub normalnym E_WARNING
poziomem błędu w PHP> = 5.4, zakładając, że próbujesz utworzyć obiekt ogólny i przypisać właściwość success
, musisz zadeklarować $res
jako obiekt stdClass
w globalnej przestrzeni nazw:
$res = new \stdClass();
$res->success = false;
if (!isset($res)) $res = new stdClass();
. W przeciwnym razie ten kod nie jest równoważnym zamiennikiem niejawnego tworzenia obiektów „starego PHP”.
Ta wiadomość E_STRICT
dotyczy PHP <= 5.3. Od PHP 5.4 zmieniono to na nieszczęście E_WARNING
. Ponieważ E_WARNING
wiadomości są przydatne, nie chcesz ich całkowicie wyłączać.
Aby pozbyć się tego ostrzeżenia, musisz użyć tego kodu:
if (!isset($res))
$res = new stdClass();
$res->success = false;
Jest to w pełni równoważna wymiana . Zapewnia dokładnie to samo, co PHP cicho robi - niestety teraz z ostrzeżeniem - niejawne tworzenie obiektów. Zawsze powinieneś sprawdzić, czy obiekt już istnieje, chyba że masz absolutną pewność, że nie istnieje. Kod dostarczony przez Michaela nie jest ogólnie dobry, ponieważ w niektórych kontekstach obiekt może czasami być już zdefiniowany w tym samym miejscu kodu, w zależności od okoliczności.
Undefined variable: res
.
Po prostu,
$res = (object)array("success"=>false); // $res->success = bool(false);
Lub możesz utworzyć instancję zajęć za pomocą:
$res = (object)array(); // object(stdClass) -> recommended
$res = (object)[]; // object(stdClass) -> works too
$res = new \stdClass(); // object(stdClass) -> old method
i wypełnij wartości:
$res->success = !!0; // bool(false)
$res->success = false; // bool(false)
$res->success = (bool)0; // bool(false)
Więcej informacji: https://www.php.net/manual/en/language.types.object.php#language.types.object.casting
$this->route->uri = new stdClass();
nie działa dla mnie, nadal mam ostrzeżenie. Uwaga: $this->route
istnieje.
Jeśli umieścisz znak „@” na początku wiersza, PHP nie wyświetli żadnego ostrzeżenia / powiadomienia dla tego wiersza. Na przykład:
$unknownVar[$someStringVariable]->totalcall = 10; // shows a warning message that contains: Creating default object from empty value
Aby zapobiec ostrzeżeniu dla tego wiersza, należy umieścić znak „@” na początku wiersza w następujący sposób:
@$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
Używam tej sztuczki podczas programowania. Nie lubię wyłączać wszystkich komunikatów ostrzegawczych, ponieważ jeśli nie będziesz obsługiwał ostrzeżeń poprawnie, w przyszłości staną się one dużym błędem.
Spróbuj tego, jeśli masz tablicę i dodaj do niej obiekty.
$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.
}
Ten wysyła ARRAY z obiektami w celu późniejszego użycia ~!
Spróbuj tego:
ini_set('error_reporting', E_STRICT);
E_STRICT
błędach oprócz błędów, w tym pomijanie komunikatów o błędach krytycznych. To nie jest rozsądna sugestia, aby rozwiązać to szczególne ostrzeżenie, a ponadto jest to coś, czego prawie nigdy nie chcesz robić. Dlaczego 5 osób głosowało za tym, nie mam pojęcia.
ini_set('error_reporting', -1);
podczas debugowania, ale nie używaj powyższych, jak zawsze.
Miałem podobny problem i to wydaje się rozwiązać problem. Musisz tylko zainicjować obiekt $ res w klasie. Załóżmy, że tutaj nazwa klasy to test.
class test
{
//You can keep the class empty or declare your success variable here
}
$res = new test();
$res->success = false;
Jest to ostrzeżenie, z którym spotkałem się w PHP 7, łatwym rozwiązaniem jest zainicjowanie zmiennej przed użyciem
$myObj=new \stdClass();
Po zainicjowaniu możesz go używać do obiektów
$myObj->mesg ="Welcome back - ".$c_user;
Przyczyną tego problemu jest przypisanie do instancji obiektu, który nie został zainicjowany. Na przykład:
Twój przypadek:
$user->email = 'exy@gmail.com';
Rozwiązanie:
$user = new User;
$user->email = 'exy@gmail.com';
Prostym sposobem na uzyskanie tego błędu jest wpisanie poniżej (a), co oznacza wpisanie (b)
(za) $this->my->variable
(b) $this->my_variable
Trywialne, ale bardzo łatwe do przeoczenia i trudne do wykrycia, jeśli go nie szukasz.
_
i->
Może być konieczne sprawdzenie, czy zmienna została zadeklarowana i ma poprawny typ.
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;
Zobacz anonimowe klasy PHP .
Miałem podobny problem podczas próby dodania zmiennej do obiektu zwróconego z interfejsu API. Iterowałem dane za pomocą pętli foreach.
foreach ( $results as $data ) {
$data->direction = 0;
}
To spowodowało wyjątek „Tworzenie domyślnego obiektu z pustej wartości” w Laravel.
Naprawiłem to z bardzo małą zmianą.
foreach ( $results as &$data ) {
$data->direction = 0;
}
Po prostu czyniąc dane $ odniesieniem.
Mam nadzieję, że to komuś pomaga, to mnie denerwowało!
Najpierw pomyśl, że powinieneś utworzyć obiekt $ res = new \ stdClass ();
następnie przypisz obiekt kluczem i wartością thay $ res-> success = false;
thay
.) Jeśli chcesz, aby podział linii po jakiejś zawartości, dodaj dwie puste spacje do widocznej zawartości linii przed przerwą.
nie, nie ... utworzy ją, gdy dodasz wartość obiektu do obiektu. klasa domyślna zostanie odziedziczona, jeśli jej nie określisz.
Spróbuj użyć:
$user = (object) null;
$res
?