it-swarm.com.de

Standardobjekt aus leeren Werten in PHP erstellen?

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?

309
Paul

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 $resNULL 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;
528

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.

42
TMS

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)
9
pirs

Versuche dies:

ini_set('error_reporting', E_STRICT);
4
Irfan Dayan

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.

3
kodmanyagha

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 ~!

2
danielad

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.

1
Tannin

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!

0
Andy

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;
0
Fischer Tirado

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 .

0
Anton Pelykh

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]';
0
Bastin Robin