436 Stimmen

Standardobjekt aus leerem Wert in PHP erstellen?

Ich sehe diesen Fehler erst, nachdem ich meine PHP-Umgebung auf PHP 5.4 und höher aktualisiert habe. Der Fehler bezieht sich auf diese Code-Zeile:

Fehler:

Standardobjekt aus leerem Wert erzeugen

Code:

$res->success = false;

Muss ich zunächst meine $res Objekt?

749voto

Michael Berkowski Punkte 260923

Ihre neue Umgebung hat möglicherweise E_STRICT Warnungen aktiviert in error_reporting für PHP-Versionen <= 5.3.x, oder einfach mit error_reporting festgelegt auf mindestens E_WARNING mit PHP-Versionen >= 5.4. Dieser Fehler wird ausgelöst, wenn $res でございます NULL oder noch nicht initialisiert:

$res = NULL;
$res->success = false; // Warning: Creating default object from empty value

PHP wird eine andere Fehlermeldung ausgeben, wenn $res ist bereits auf einen Wert initialisiert, ist aber kein Objekt:

$res = 33;
$res->success = false; // Warning: Attempt to assign property of non-object

Zur Einhaltung der E_STRICT Standards vor PHP 5.4, oder die normale E_WARNING Fehlerlevel in PHP >= 5.4, vorausgesetzt, Sie versuchen, ein generisches Objekt zu erstellen und weisen die Eigenschaft success müssen Sie folgende Angaben machen $res als ein Objekt von stdClass im globalen Namespace:

$res = new \stdClass();
$res->success = false;

68voto

Tomas Punkte 54613

Diese Nachricht wurde E_STRICT für PHP <= 5.3. Seit PHP 5.4 wurde es unglücklicherweise geändert in E_WARNING . Desde E_WARNING Nachrichten nützlich sind, sollten Sie sie nicht vollständig deaktivieren.

Um diese Warnung loszuwerden, müssen Sie diesen Code verwenden:

if (!isset($res)) 
    $res = new stdClass();

$res->success = false;

Dies ist vollwertiger Ersatz . Es stellt genau das sicher, was PHP stillschweigend tut - leider jetzt mit Warnung - implizite Objekterzeugung. Sie sollten immer prüfen, ob das Objekt bereits existiert, es sei denn, Sie sind absolut sicher, dass es nicht existiert. Der von Michael zur Verfügung gestellte Code taugt im Allgemeinen nicht, da das Objekt in manchen Kontexten je nach den Umständen bereits an derselben Stelle im Code definiert sein kann.

19voto

pirs Punkte 2122

Einfach,

    $res = (object)array("success"=>false); // $res->success = bool(false);

Oder Sie könnten Klassen mit instanziieren:

    $res = (object)array(); // object(stdClass) -> recommended

    $res = (object)[];      // object(stdClass) -> works too

    $res = new \stdClass(); // object(stdClass) -> old method

und füllen Werte mit:

    $res->success = !!0;     // bool(false)

    $res->success = false;   // bool(false)

    $res->success = (bool)0; // bool(false)

Mehr Informationen: https://www.php.net/manual/en/language.types.object.php#language.types.object.casting

8voto

kodmanyagha Punkte 845

Wenn Sie ein "@"-Zeichen an den Anfang der Zeile 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 "@" an den Anfang der Zeile 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 verwende diesen Trick beim Entwickeln. Ich mag es nicht, alle Warnmeldungen zu deaktivieren, denn wenn man Warnungen nicht richtig behandelt, werden sie in Zukunft zu einem großen Fehler.

6voto

Daniel Adenew Punkte 7235

Versuchen Sie dies, wenn Sie ein Array haben und ihm Objekte hinzufügen.

$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.
}

Damit wird ARRAY von Objekte zur späteren Verwendung~!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X