Dieser Fehler wird erst angezeigt, nachdem meine PHP - Umgebung auf PHP 5.4 und höher aktualisiert wurde. Der Fehler zeigt auf diese Codezeile:
Error:
Standardobjekt aus leerem Wert erstellen
Code:
$res->success = false;
Muss ich zuerst mein $res
-Objekt deklarieren?
In Ihrer neuen Umgebung können E_STRICT
-Warnungen in error_reporting
für PHP -Versionen <= 5.3.x aktiviert sein oder einfach error_reporting
auf mindestens E_WARNING
mit PHP -Versionen> = 5.4 gesetzt sein. Dieser Fehler wird ausgelöst, wenn $res
NULL
ist oder noch nicht initialisiert wurde:
$res = NULL;
$res->success = false; // Warning: Creating default object from empty value
PHP meldet eine andere Fehlermeldung, wenn $res
bereits mit einem bestimmten Wert initialisiert wurde, aber kein Objekt ist:
$res = 33;
$res->success = false; // Warning: Attempt to assign property of non-object
Um die E_STRICT
-Standards vor PHP 5.4 oder die normale E_WARNING
-Fehlerstufe in PHP> = 5.4 einzuhalten, müssen Sie ein generisches Objekt erstellen und die Eigenschaft success
zuweisen $res
als Objekt von stdClass
im globalen Namespace deklarieren:
$res = new \stdClass();
$res->success = false;
Diese Nachricht wurde E_STRICT
für PHP <= 5.3. Seit PHP 5.4 wurde es unglücklicherweise in E_WARNING
geändert. Da E_WARNING
-Nachrichten 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 völlig gleichwertiger Ersatz . Es stellt genau das sicher, was PHP im Hintergrund tut - leider mit Warnung - implizite Objekterstellung. Sie sollten immer überprüfen, ob das Objekt bereits existiert, es sei denn, Sie sind absolut sicher, dass dies nicht der Fall ist. Der von Michael bereitgestellte Code ist im Allgemeinen nicht geeignet, da das Objekt in einigen Kontexten je nach den Umständen möglicherweise bereits an derselben Stelle im Code definiert ist.
Einfach,
$res = (object)array("success"=>false); // $res->success = bool(false);
oder
$res = (object)array(); // object(stdClass)
$res = new stdClass(); // old method
und
$res->success = !!0; // bool(false)
$res->success = false; // bool(false)
$res->success = (bool)0; // bool(false)
Versuche dies:
ini_set('error_reporting', E_STRICT);
Wenn Sie das Zeichen "@" am Zeilenanfang setzen, zeigt PHP keine Warnung/Hinweis 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 das Zeichen "@" wie folgt setzen:
@$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 beim Entwickeln. Ich mag es nicht, alle Warnmeldungen zu deaktivieren, denn wenn Sie mit Warnungen nicht korrekt umgehen, werden sie in Zukunft zu einem großen Fehler.
Versuchen Sie dies, wenn Sie über ein Array verfügen, 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 sendetARRAYof Objects zur späteren Verwendung ~!
Eine einfache Möglichkeit, diesen Fehler zu erhalten, besteht darin, (a) unten einzugeben.
(a)$this->my->variable
(b)$this->my_variable
Trivial, aber sehr leicht zu übersehen und schwer zu erkennen, wenn Sie nicht danach suchen.
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 kleinen Änderung behoben.
foreach ( $results as &$data ) {
$data->direction = 0;
}
Indem Sie einfach $ data als Referenz verwenden.
Ich hoffe, das hilft jemandem. Es hat mich verdammt noch mal geärgert!
Ich hatte ein ähnliches Problem und dies scheint das Problem zu lösen. Sie müssen lediglich das $ res-Objekt mit einer Klasse initialisieren. Angenommen, der Klassenname lautet test.
class test
{
//You can keep the class empty or declare your success variable here
}
$res = new test();
$res->success = false;
Versuchen Sie es mit:
$user = (object) null;
Möglicherweise müssen Sie prüfen, ob die deklarierte Variable einen korrekten 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 PHP anonyme Klassen .
Dieses Problem wird dadurch verursacht, dass Sie eine Instanz eines Objekts zuweisen, das nicht initiiert wird. Für zB:
Dein Fall:
$user->email = '[email protected]';
Lösung:
$user = new User;
$user->email = '[email protected]';