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?


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())

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})

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.


2
To pytanie nie dodaje nic nowego w porównaniu z pytaniem @ YannickRochon.
helvete
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.