Über error", Versuch zum ändern der Eigenschaft der nicht-Objekt"
Kann mir jemand sagen warum der folgende code unterschiedliche Ergebnisse haben ?
unset Objekt-Eigenschaft
$s = new StdClass;
unset($s->a->b); //it is working fine
unset($s->x->y->z); //it is got an error: Attempt to modify property of non-object
unset array-index
$a = array();
unset($a[1][2]); //it is working fine
unset($a[3][4][5]); //it is working fine
- c ist eine Eigenschaft von Objekt b, so dass Sie nicht unset c, nachdem Sie haben bereits gelöschtes Objekt b selbst. Reservieren Sie bestellen. Erste unset Eigenschaft c und dann Objekt b. Wenn Sie versuchen, unset array-element, das nicht existiert, Sie bekommen eben keinen Fehler, aber tatsächlich passiert nichts.
Du musst angemeldet sein, um einen Kommentar abzugeben.
StdClass vs Array
Array
Arrays in PHP ermöglichen die implizite Erzeugung von mehrdimensionalen arrays von der Basis. ie:
Den
var_dump
von den oben genannten gibt:In PHP 5.4.x keine Hinweise gegeben werden, entweder. Sie könnte auch tun:
Und alle Ebenen des Arrays werden implizit angelegt, geben die
var_dump
von:PHP wurde entworfen, um diese Art der array-Erstellung mit Leichtigkeit. Für mehr Informationen, wie arrays behandelt werden, Lesen Sie bitte die Array-Typ Dokumentation. Weil dieses, wenn Sie Zugriff auf einen Schlüssel in einem array für die Wert-Zuweisung, wenn es nicht bereits vorhanden ist, wird es implizit erstellt. Wenn verwendet, in Verbindung mit
unset
keine Fehler geworfen werden, denn es können bis zum letzten array und sehen, dass es Schlüssel gibt es nicht.StdClass
Weil dies eine
object
Eigenschaften muss explizit erstellt werden, an dem vorbei, was geworfen wurde, um es. Zum Beispiel:Ausbeute:
Wie schaffen wir die
object
's erforderlich, diesen Punkt zu erreichen. Wenn Sie jedoch versuchen Sie und verwenden Sie:Erhalten Sie die Fehlermeldung:
Jedoch, das Objekt wird dann erstellt, geben die
var_dump
von:Was ist das, was man "erwartet" es geht durch die Werte
a
und erstellt ein Standard-Objekt, dannb
und weist dann die Eigenschaft objectb->c
mit dem Wert "test". Wennunset
die Werte in einem Objekt, es wird nicht gehen durch Gießen alle Eigenschaften auf default-Objekte für Sie. Zum Beispiel,Nicht geben Ihnen ein Fehler, weil
a
werden kann, eine Eigenschaft von$s
, und nicht eine Standard-Typumwandlung auf ein Objekt und dann unsetb
. Jedoch, es wird nicht gehen weiter unten in der Liste.Gehen mit der Annahme, dass
b
ist ein erstelltes Objekt ina
, ist es aber nicht, so dass Sie versuchen, Zugriff auf eine Eigenschaft der nicht-Objekt durch die Verwendungb->c
. Ein klareres Beispiel:den
unset
hier wird nicht werfen Fehler, denn es wird ein Typ-castc
um auf ein Objekt und dannunset
died
. Erhalten Sie die Warnung, dass wirft Sie alle Weg, bis zuc
alsstdClass
obwohl. Was dies zeigt, ist, dass das Letzte element/Klasse wird durch den Typ-cast auf ein Objekt, um Zugriff auf die Eigenschaft, wenn es nicht bereits eins, aber es wird nicht type-cast alle die Elemente, um den Zugriff auf die Letzte Eigenschaft bei der Verwendung vonunset
.Abschluss
In allen, ist der Unterschied zwischen dem, wie PHP behandelt arrays und wie es verarbeitet Objekte. Objekte haben einen strengeren standard und sind nicht unbedingt type-cast auf mehrere Ebenen, wie auf Sie zugegriffen werden
unset
, in der Erwägung, dass arrays sind. Mit Objekten, können Sie implizit erstellen Sie die Ebenen benötigt (immer eine Warnung, wie Sie es tun), aber wenn ausgeschaltet, werden die Typ-casting nicht passieren, und Sie sind für den Zugriff auf Eigenschaften, die nicht existieren.