Über den Fehler "Versuch, die Eigenschaft eines Nichtobjekts zu ändern"

8

Kann mir jemand sagen, warum der folgende Code andere Ergebnisse haben wird?

Ungesetzte Objekteigenschaft

%Vor%

Unbenannter Array-Index

%Vor%     
Jasper 03.05.2013, 17:49
quelle

1 Antwort

18

StdClass vs Array

Array

Arrays in PHP erlauben die implizite Erstellung von mehrdimensionalen Arrays von der Basis aus. zB:

%Vor%

Das var_dump des obigen gibt:

%Vor%

In PHP 5.4.x werden auch keine Hinweise gegeben. Sie könnten auch tun:

%Vor%

Und alle Ebenen des Arrays werden implizit mit dem var_dump von:

erstellt %Vor%

PHP wurde entwickelt, um diese Art der Array-Erstellung mit Leichtigkeit zu handhaben. Weitere Informationen zur Handhabung von Arrays finden Sie in der Array-Typ -Dokumentation. Wenn Sie daher auf einen Schlüssel innerhalb eines Arrays für die Wertzuweisung zugreifen, wird dieser implizit erstellt, falls er nicht bereits vorhanden ist. Bei Verwendung in Verbindung mit unset werden keine Fehler ausgelöst, da es bis zum letzten Array prüfen kann und feststellen kann, dass der Schlüssel nicht existiert.

StdClass

Da dies ein object ist, müssen Eigenschaften explizit nach dem, was in sie gegossen wurde, erstellt werden. Zum Beispiel:

%Vor%

Wird ergeben:

%Vor%

Wir erstellen die object , die benötigt werden, um diesen Punkt zu erreichen. Wenn Sie jedoch versuchen und verwenden:

%Vor%

Sie erhalten den Fehler:

  

Warnung: Erstellen eines Standardobjekts aus einem leeren Wert in Datei.php in Zeile x

Das Objekt wird dann jedoch mit dem var_dump von:

erstellt %Vor%

Was Sie erwarten würden, wenn es die Werte a durchläuft und ein Standardobjekt erstellt, dann b und weist dann die Objekteigenschaft b->c dem Wert von "test" zu. Wenn Sie zu unset die Werte in einem Objekt verwenden, werden nicht alle Eigenschaften auf Standardobjekte für Sie übertragen. Zum Beispiel

%Vor%

Sie erhalten keinen Fehler, da a eine Eigenschaft von $s sein kann und einen Standard-Cast für ein Objekt ausführt und dann b deaktiviert. Es wird jedoch nicht weiter unten auf der Liste gehen.

%Vor%

Geht von der Annahme aus, dass b ein erstelltes Objekt in a ist, aber nicht, also versuchen Sie, mit b->c auf eine Eigenschaft eines Nicht-Objekts zuzugreifen. Ein expliziteres Beispiel:

%Vor%

Das unset hier wird keine Fehler werfen, weil es c an ein Objekt und unset an das d schreibt. Sie erhalten jedoch die Warnung, dass der gesamte Code bis c als stdClass ausgegeben wird. Was dies zeigt, ist, dass das letzte Element / die letzte Klasse typisiert auf ein Objekt umschaltet, um auf die Eigenschaft zuzugreifen, wenn es noch nicht vorhanden ist, aber nicht alle Elemente, um auf die letzte Eigenschaft zuzugreifen, wenn% co_de verwendet wird %.

Fazit

Insgesamt besteht der Unterschied zwischen der Handhabung von Arrays durch PHP und der Behandlung von Objekten. Objekte haben einen strengeren Standard und werden nicht implizit auf mehrere Ebenen typisiert, da sie auf unset zugreifen, während Arrays. Mit Objekten können Sie sie implizit auf die benötigten Ebenen erstellen (indem Sie eine Warnung erhalten, wie Sie es tun), aber wenn sie nicht gesetzt ist, findet das Typcasting nicht statt und Sie greifen auf Eigenschaften zu, die nicht existieren.

    
Jon 03.05.2013, 18:00
quelle

Tags und Links