Czy można usunąć właściwość obiektu w PHP?

196

Jeśli mam stdObjectdo powiedzenia, $a.

Na pewno nie ma problemu z przypisaniem nowej właściwości $a,

$a->new_property = $xyz;

Ale potem chcę go usunąć, więc unsetnie ma tu żadnej pomocy.

Więc,

$a->new_property = null;

jest tego rodzaju. Ale czy istnieje bardziej „elegancki” sposób?

łoś
źródło
Czy możesz napisać kod, jak próbowałeś z unset? W moim odczuciu unset powinien działać, ale możliwe, że
powielasz
naprawdę nie jestem pewien, jak unset () jest bardziej elegancki niż = null, ale być może to tylko ja
Robert Sinclair

Odpowiedzi:

354
unset($a->new_property);

Działa to w przypadku elementów tablicy, zmiennych i atrybutów obiektu.

Przykład:

$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
źródło
10
nb Nie można bezpośrednio rozbroić właściwości, która ma klucz liczby całkowitej. np. $o=(object)array('a','b','c'); (Musisz przekonwertować obiekt (z powrotem) na tablicę, aby uzyskać dostęp do takich właściwości!)
danorton
4
@YanickRochon, mój komentarz dotyczy an object, a nie an array. ;-)
danorton
1
@danorton dlaczego ktoś, przy zdrowych zmysłach, zamieniłby arrayw w object? To po prostu nie ma sensu (nawet jeśli PHP na to pozwala). Komentując to, nie będę wychwytywał i rozpowszechniał złych nawyków programistycznych :) Bez obrazy.
Yanick Rochon
8
@YanickRochon może to mieć sens, jeśli chcesz scalić właściwości dwóch obiektów (które nie mają metody, są one po prostu używane jako nośnik pamięci): w tym przypadku najszybszą i najprostszą drogą jest konwersja obu obiektów na tablice w celu zastosowania array_replace_recursive () i potem z powrotem na obiekty. Co do tego, dlaczego ktoś używałby obiektu do przechowywania tylko właściwości, dzieje się to często w aplikacjach pobierających z baz danych, takich jak MySQL, rekordy jako obiekt zamiast tablicy (przy użyciu standardowych funkcji, takich jak mysql_fetch_object ()).
wredny
1
@danorton FYI, ponieważ 7.2 możesz zrobić unset($o->{0});lub $k = 0; unset($o->$k);.
Sarke
43

Działa to również szczególnie, jeśli zapętlasz obiekt.

unset($object[$key])

Aktualizacja

Nowsze wersje PHP Fatal error: Cannot use object of type Object as arraygenerują błąd krytyczny, o którym wspomniał @CXJ. W takim przypadku możesz użyć nawiasów

unset($object{$key})
Sajjad Ashraf
źródło
Czy możesz określić, które „nowsze” wersje są opisane? Dla mnie z PHP 7.1 unset($object[$key])działa i unset($object->{$key})nie działa (a dokładniej, unset($object['literal_key'])i unset($object->{'literal_key'})). PS Hm, jednak mogę się mylić, myśląc, że to, co
edytuję
Nie wyłącza właściwości z kolekcji obiektów.
Viktor Joras,
1

Działa to również, jeśli zapętlasz obiekt.

unset($object->$key);

Nie trzeba używać nawiasów.

dandyboh
źródło
2
To pytanie nie dodaje nic nowego w porównaniu z pytaniem @ YannickRochon.
helvete