Standardobjekt aus leerem Wert in PHP erstellen?

Lesezeit: 2 Minuten

Standardobjekt aus leerem Wert in PHP erstellen
Paul

Ich sehe diesen Fehler nur, nachdem ich meine PHP-Umgebung auf PHP 5.4 und höher aktualisiert habe. Der Fehler zeigt auf diese Codezeile:

Fehler:

Erstellen eines Standardobjekts aus einem leeren Wert

Code:

$res->success = false;

Muss ich meine erst deklarieren $res Objekt?

  • Wie/Wo initiieren Sie $res ?

    – Naveed

    17. Januar 2012 um 19:45 Uhr

  • @NAVEED Dort.

    – 7heo.tk

    8. Juli 2016 um 10:00 Uhr

1646936049 855 Standardobjekt aus leerem Wert in PHP erstellen
Michael Berkowski

Ihre neue Umgebung hat vielleicht E_STRICT Warnungen aktiviert ein error_reporting für PHP-Versionen <= 5.3.x, oder einfach haben error_reporting mindestens einstellen 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 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

Um einzuhalten E_STRICT Standards vor PHP 5.4 oder die normalen E_WARNING Fehlerstufe in PHP >= 5.4, vorausgesetzt, Sie versuchen, ein generisches Objekt zu erstellen und die Eigenschaft zuzuweisen successmüssen Sie deklarieren $res als Gegenstand von stdClass im globalen Namensraum:

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

  • Sie sollten prüfen, ob das Objekt bereits existiert: if (!isset($res)) $res = new stdClass();. Ansonsten ist dieser Code kein äquivalenter Ersatz für die implizite Objekterstellung des “alten PHP”.

    – Thomas

    23. November 2013 um 15:44 Uhr

  • @Tomas Müssen wir das noch einmal machen? Die Mods haben beim letzten Mal den Kommentar-Thread aufgeräumt, weil er wenig Mehrwert brachte. Es gibt keine implizite Objekterstellung für “altes PHP”. Es war immer ein Fehler und es wurde immer eine Warnung ausgegeben, nur dass es in 5.4 von E_STRICT zu E_WARNING geändert wurde, so dass einige Leute nie darauf gestoßen sind, weil sie E_STRICT nicht beachtet haben.

    – Michael Berkowski

    23. November 2013 um 15:51 Uhr

  • @PeterAlfvin es wurde nicht definiert in diesem einen bestimmten Lauf! Aber in einem anderen Lauf, an genau der gleichen Stelle im Code, das Objekt könnte bereits definiert sein! Das ist ein Denkfehler, den Menschen oft machen, und das ist der Grund, warum ich versuche, das zu betonen.

    – Thomas

    23. November 2013 um 16:10 Uhr

  • Michael, die implizite Objekterzeugung war und ist auch in 5.4 immer vorhanden. Und BTW In PHP < 5.3 war es weder E_STRICT noch E_WARNING. Und übrigens, Mods haben den Kommentar wiederhergestellt und mir wurde gesagt, ich solle ihn abschwächen, deshalb habe ich ihn erneut gepostet.

    – Thomas

    23. November 2013 um 16:13 Uhr


  • @tomas Oh, ok, ich Überlegen Ich verstehe, was du meinst. Es scheint seltsam, dass Sie/Michael das nicht abschließen können. Übrigens, dieser Austausch hat mich zu der Erkenntnis geführt, dass Kursivschrift

    – Peter Alfwin

    23. November 2013 um 16:19 Uhr

Diese Nachricht wurde E_STRICT für PHP <= 5.3. Seit PHP 5.4 wurde es unglücklicherweise geändert E_WARNING. Seit E_WARNING Nachrichten nützlich sind, möchten 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;

Das ist voll gleichwertiger Ersatz. Es stellt genau dasselbe sicher, was PHP stillschweigend tut – leider jetzt 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 gut, da das Objekt in manchen Kontexten je nach Umständen manchmal bereits an derselben Stelle im Code definiert ist.

  • @carlosvini, das wird dir geben Undefined variable: res.

    – Schrittmacher

    26. Januar 2015 um 12:49 Uhr

  • @Pacerier Du hast recht, das Beste, was du tun kannst, ist: $res = isset($res) ? $res : neue stdClass(); — das war der Grund, warum ich E_NOTICE vor 6 Monaten nicht aktiviert hatte, da es zu verdammt ausführlich ist.

    – Carloswini

    26. Januar 2015 um 13:48 Uhr

Standardobjekt aus leerem Wert in PHP erstellen
pirs

Einfach,

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

Oder Sie könnten Klassen instanziieren mit:

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

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

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

und Werte füllen mit:

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

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

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

Weitere Infos:
https://www.php.net/manual/en/language.types.object.php#language.types.object.casting

  • Warum wird new stdClass() als “alte” Methode betrachtet? Sind die anderen irgendwie besser?

    – Aaron

    25. März 2017 um 0:03 Uhr

  • Es ist einfach von der alten PHP-Version

    – pirs

    1. April 2017 um 0:36 Uhr

  • in meinem Fall $this->route->uri = new stdClass(); funktioniert bei mir nicht, ich habe immer noch die Warnung. Notiz : $this->route ist vorhanden.

    – Melomann

    3. Januar 2020 um 7:15 Uhr


  • Vielleicht ist dies nicht mit neuen PHP-Versionen kompatibel? Welche Version hast du verwendet?

    – pirs

    12. Januar 2020 um 10:43 Uhr

Standardobjekt aus leerem Wert in PHP erstellen
kodmanyagha

Wenn Sie das Zeichen „@“ am 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 “@” 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 verwende diesen Trick beim Entwickeln. Ich mag es nicht, alle Warnmeldungen zu deaktivieren, denn wenn Sie mit Warnungen nicht richtig umgehen, werden sie in Zukunft zu einem großen Fehler.

Versuchen Sie dies, wenn Sie ein Array haben und 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.
}

Dies sendet ARRAY von Objekte zur späteren Verwendung~!

  • DANKE!!!! Das hat geholfen, die Arbeit zu erledigen. Ich musste PHP Schritt für Schritt mitteilen, was jedes Element war. Danke, dass du mich daran erinnert hast, nicht faul zu programmieren, lol.

    – Janike

    11. Juni 2020 um 18:59 Uhr


1646936050 855 Standardobjekt aus leerem Wert in PHP erstellen
Banker

In PHP 7 können anonyme Objekte auf diese Weise erstellt werden:

$res = new class {
    public $success = false;
};

https://www.php.net/manual/en/language.oop5.anonymous.php
http://sandbox.onlinephpfunctions.com/code/ab774707a8219c0f35bdba49cc84228b580b52ee

  • DANKE!!!! Das hat geholfen, die Arbeit zu erledigen. Ich musste PHP Schritt für Schritt mitteilen, was jedes Element war. Danke, dass du mich daran erinnert hast, nicht faul zu programmieren, lol.

    – Janike

    11. Juni 2020 um 18:59 Uhr


1646936051 74 Standardobjekt aus leerem Wert in PHP erstellen
Sukron Ma’mun

  1. Denken Sie zuerst, Sie sollten das Objekt $res = new \stdClass();

  2. dann Objekt mit Schlüssel und Wert zuweisen $res->success = false;

  • (Ich verstehe nicht thay.) Wenn Sie nach einigen Inhalten einen Zeilenumbruch wünschen, hängen Sie zwei Leerzeichen an den sichtbaren Inhalt der Zeile vor dem Umbruch an.

    – Graubart

    28. April 2020 um 9:20 Uhr


988650cookie-checkStandardobjekt aus leerem Wert in PHP erstellen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy