Antworten:
Ihre neue Umgebung kann E_STRICTWarnungen aktiviert inerror_reporting PHP - Versionen <= 5.3.x oder einfach hat error_reportingauf mindestens E_WARNINGmit PHP - Versionen> = 5.4. Dieser Fehler wird ausgelöst, wenn $resist NULLoder noch nicht initialisiert:
$res = NULL;
$res->success = false; // Warning: Creating default object from empty value
PHP meldet eine andere Fehlermeldung, wenn $reses bereits auf einen bestimmten Wert initialisiert wurde, aber kein Objekt ist:
$res = 33;
$res->success = false; // Warning: Attempt to assign property of non-object
Um zu erfüllen E_STRICTStandards vor PHP 5.4 oder der normalen E_WARNINGFehlerebene in PHP> = 5,4, vorausgesetzt , Sie versuchen , ein generisches Objekt zu erstellen und weisen Sie die Eigenschaft success, müssen Sie erklären , $resals ein Objekt der stdClassim globalen Namespace:
$res = new \stdClass();
$res->success = false;
if (!isset($res)) $res = new stdClass();. Andernfalls ist dieser Code kein gleichwertiger Ersatz für die implizite Objekterstellung "altes PHP".
Diese Nachricht war E_STRICTfür PHP <= 5.3. Seit PHP 5.4 wurde es unglücklicherweise auf geändert E_WARNING. Da E_WARNINGNachrichten nützlich sind, möchten Sie sie nicht vollständig deaktivieren.
Um diese Warnung zu entfernen, müssen Sie diesen Code verwenden:
if (!isset($res))
$res = new stdClass();
$res->success = false;
Dies ist ein völlig gleichwertiger Ersatz . Es stellt genau das sicher, was PHP stillschweigend tut - leider mit Warnung jetzt - implizite Objekterstellung. Sie sollten immer überprüfen, ob das Objekt bereits vorhanden ist, es sei denn, Sie sind sich absolut sicher, dass dies nicht der Fall ist. Der von Michael bereitgestellte Code ist im Allgemeinen nicht gut, da das Objekt in einigen Kontexten je nach den Umständen manchmal bereits an derselben Stelle im Code definiert ist.
Undefined variable: res.
Einfach,
$res = (object)array("success"=>false); // $res->success = bool(false);
Oder Sie können Klassen instanziieren mit:
$res = (object)array(); // object(stdClass) -> recommended
$res = (object)[]; // object(stdClass) -> works too
$res = new \stdClass(); // object(stdClass) -> old method
und fülle Werte mit:
$res->success = !!0; // bool(false)
$res->success = false; // bool(false)
$res->success = (bool)0; // bool(false)
Weitere Informationen: https://www.php.net/manual/en/language.types.object.php#language.types.object.casting
$this->route->uri = new stdClass();funktioniert nicht für mich, ich habe immer noch die Warnung. Hinweis: $this->routeist vorhanden.
Wenn Sie den Zeilenanfang "@" in die Zeile setzen, zeigt PHP keine Warnung / Benachrichtigung für diese Zeile an. Zum Beispiel:
$unknownVar[$someStringVariable]->totalcall = 10; // shows a warning message that contains: Creating default object from empty value
Um diese Warnung für diese Zeile zu verhindern, müssen Sie den Zeilenanfang wie folgt in die Zeile einfügen:
@$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
Ich benutze diesen Trick bei der Entwicklung. Ich mag es nicht, alle Warnmeldungen zu deaktivieren, denn wenn Sie Warnungen nicht richtig behandeln, werden sie in Zukunft zu einem großen Fehler.
Versuchen Sie dies, wenn Sie ein Array haben und fügen Sie Objekte hinzu.
$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.
}
Dies sendet ARRAY of Objects zur späteren Verwendung ~!
Versuche dies:
ini_set('error_reporting', E_STRICT);
E_STRICTFehlern, einschließlich der Unterdrückung von Meldungen für schwerwiegende Fehler. Das ist kein vernünftiger Vorschlag, um diese spezielle Warnung zu lösen, und außerdem möchten Sie so gut wie nie etwas tun. Warum 5 Leute dies positiv bewertet haben, weiß ich nicht.
ini_set('error_reporting', -1);beim Debuggen, aber verwenden Sie es nicht wie immer.
Ich hatte ein ähnliches Problem und dies scheint das Problem zu lösen. Sie müssen nur das $ res-Objekt für eine Klasse initialisieren. Angenommen, hier lautet der Klassenname test.
class test
{
//You can keep the class empty or declare your success variable here
}
$res = new test();
$res->success = false;
Dies ist eine Warnung, mit der ich in PHP 7 konfrontiert war. Die einfache Lösung besteht darin, die Variable vor der Verwendung zu initialisieren
$myObj=new \stdClass();
Sobald Sie es initialisiert haben, können Sie es für Objekte verwenden
$myObj->mesg ="Welcome back - ".$c_user;
Dieses Problem wird verursacht, weil Sie einer Instanz eines Objekts zuweisen, das nicht initiiert wurde. Zum Beispiel:
Dein Fall:
$user->email = 'exy@gmail.com';
Lösung:
$user = new User;
$user->email = 'exy@gmail.com';
Eine einfache Möglichkeit, diesen Fehler zu erhalten, besteht darin, (a) unten einzugeben, dh (b) einzugeben.
(ein) $this->my->variable
(b) $this->my_variable
Trivial, aber sehr leicht zu übersehen und schwer zu erkennen, wenn Sie nicht danach suchen.
_und->
Möglicherweise müssen Sie überprüfen, ob die Variable deklariert ist und den richtigen Typ hat.
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;
Siehe anonyme PHP-Klassen .
Ich hatte ein ähnliches Problem beim Versuch, einem von einer API zurückgegebenen Objekt eine Variable hinzuzufügen. Ich habe die Daten mit einer foreach-Schleife durchlaufen.
foreach ( $results as $data ) {
$data->direction = 0;
}
Dies löste die Ausnahme "Standardobjekt aus leerem Wert erstellen" in Laravel aus.
Ich habe es mit einer sehr kleinen Änderung behoben.
foreach ( $results as &$data ) {
$data->direction = 0;
}
Indem Sie einfach $ data zu einer Referenz machen.
Ich hoffe das hilft jemandem und es hat mich verdammt geärgert!
Denken Sie zuerst, Sie sollten das Objekt $ res = new \ stdClass () erstellen.
dann Objekt mit Schlüssel und Wert zuweisen, dass $ res-> success = false;
thay.) Wenn Sie nach einigen Inhalten einen Zeilenumbruch wünschen, fügen Sie vor dem zukünftigen Zeilenumbruch zwei Leerzeichen an den sichtbaren Inhalt der Zeile an.
Nein, das tun Sie nicht. Es wird erstellt, wenn Sie dem Objekt den Erfolgswert hinzufügen. Die Standardklasse wird vererbt, wenn Sie keine angeben.
Versuchen Sie es mit:
$user = (object) null;
$res?