Antworten:
Ihre neue Umgebung kann E_STRICT
Warnungen aktiviert inerror_reporting
PHP - Versionen <= 5.3.x oder einfach hat error_reporting
auf mindestens E_WARNING
mit PHP - Versionen> = 5.4. Dieser Fehler wird ausgelöst, wenn $res
ist NULL
oder noch nicht initialisiert:
$res = NULL;
$res->success = false; // Warning: Creating default object from empty value
PHP meldet eine andere Fehlermeldung, wenn $res
es 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_STRICT
Standards vor PHP 5.4 oder der normalen E_WARNING
Fehlerebene in PHP> = 5,4, vorausgesetzt , Sie versuchen , ein generisches Objekt zu erstellen und weisen Sie die Eigenschaft success
, müssen Sie erklären , $res
als ein Objekt der stdClass
im 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_STRICT
für PHP <= 5.3. Seit PHP 5.4 wurde es unglücklicherweise auf geändert E_WARNING
. 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 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->route
ist 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_STRICT
Fehlern, 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
?