Ist es möglich, die Eigenschaft eines Objekts in PHP zu löschen?

193

Wenn ich stdObjectmitreden kann , $a.

Sicher gibt es kein Problem, eine neue Eigenschaft zuzuweisen $a.

$a->new_property = $xyz;

Aber dann möchte ich es entfernen, daher unsethilft es hier nicht weiter.

So,

$a->new_property = null;

ist irgendwie davon. Aber gibt es einen eleganteren Weg?

valk
quelle
Können Sie eine Postleitzahl angeben, wie Sie es mit unset versucht haben? In meinem Sinne sollte unset nicht funktionieren. Aber möglicherweise duplizieren Sie den Kontext
Arshdeep
Ich
Robert Sinclair

Antworten:

350
unset($a->new_property);

Dies funktioniert für Array-Elemente, Variablen und Objektattribute.

Beispiel:

$a = new stdClass();

$a->new_property = 'foo';
var_export($a);  // -> stdClass::__set_state(array('new_property' => 'foo'))

unset($a->new_property);
var_export($a);  // -> stdClass::__set_state(array())
Yanick Rochon
quelle
10
nb Es ist nicht möglich, eine Eigenschaft mit einem Ganzzahlschlüssel direkt zu deaktivieren. zB $o=(object)array('a','b','c'); (Sie müssen das Objekt (zurück) in ein Array konvertieren, um einfach auf solche Eigenschaften zugreifen zu können !)
danorton
4
@YanickRochon, mein Kommentar handelt von einem object, nicht von einem array. ;-)
Danorton
1
@danorton warum sollte jemand, der bei klarem Verstand ist, ein arrayin ein konvertieren object? Es macht einfach keinen Sinn (auch wenn PHP es erlaubt). Ich werde schlechte Programmiergewohnheiten nicht durch Kommentare dazu verbreiten :) Keine Beleidigung.
Yanick Rochon
8
@YanickRochon Dies kann sinnvoll sein, wenn Sie die Eigenschaften von zwei Objekten zusammenführen möchten (die keine Methode haben, sondern nur als Speichermedium verwendet werden): In diesem Fall besteht die schnellste und einfachste Methode darin, beide Objekte in Arrays zu konvertieren, um array_replace_recursive anzuwenden () und danach zurück auf Objekte. Warum jemand ein Objekt nur zum Speichern von Eigenschaften verwendet, geschieht dies häufig in Anwendungen, die Datensätze aus Datenbanken wie MySQL als Objekt anstelle eines Arrays abrufen (unter Verwendung von Standardfunktionen wie mysql_fetch_object ()).
gaborous
1
@danorton FYI, seit 7.2 können Sie tun unset($o->{0});oder $k = 0; unset($o->$k);.
Sarke
43

Dies funktioniert auch besonders, wenn Sie ein Objekt durchlaufen.

unset($object[$key])

Aktualisieren

Neuere Versionen von PHP verursachen schwerwiegende Fehler, Fatal error: Cannot use object of type Object as arraywie von @CXJ erwähnt. In diesem Fall können Sie stattdessen Klammern verwenden

unset($object{$key})
Sajjad Ashraf
quelle
Können Sie angeben, welche "neueren" Versionen beschrieben werden? Für mich unset($object[$key])funktioniert und unset($object->{$key})funktioniert PHP 7.1 nicht (genauer gesagt unset($object['literal_key'])und unset($object->{'literal_key'})). PS Hm, ich kann mich jedoch irren, wenn ich denke, dass das, was ich bearbeite, ein Objekt ist, kein Array
YakovL
Hebt keine Eigenschaft aus einer Sammlung von Objekten auf.
Viktor Joras
1

Dies funktioniert auch, wenn Sie ein Objekt durchlaufen.

unset($object->$key);

Klammern müssen nicht verwendet werden.

Dandyboh
quelle
2
Diese Frage fügt im Vergleich zu der von @ YannickRochon nichts Neues hinzu.
Helvete