Чи можна видалити властивість об'єкта в PHP?


196

Якщо у мене є stdObjectдумка, $a.

Звичайно, немає проблеми призначити нову власність $a,

$a->new_property = $xyz;

Але тоді я хочу його зняти, тому unsetтут нічого не допомагає.

Так,

$a->new_property = null;

це свого роду. Але чи є більш елегантний спосіб?


Чи можете ви розмістити код, як ви намагалися з невстановленим? У моєму сенсі невміння має спрацювати. Але можливо, ви
дублюєте

дійсно не впевнений, наскільки unset () елегантніше, ніж = null, але може бути, це тільки я
Роберт Сінклер

Відповіді:


355
unset($a->new_property);

Це працює для елементів масиву, змінних та атрибутів об'єкта.

Приклад:

$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 Неможливо безпосередньо скасувати властивість, що має цілий ключ. напр. $o=(object)array('a','b','c'); (Ви повинні перетворити об’єкт (назад) у масив навіть для простого доступу до таких властивостей!)
danorton

4
@YanickRochon, мій коментар стосується не object, а не array. ;-)
danorton

1
@danorton чому б хтось, на їх думку, перетворив " arrayна" object? Це просто не має сенсу (навіть якщо PHP це дозволяє). Я не буду закликати і поширювати погані звички програмування, коментуючи це :) Без образи.
Янік Рошон

8
@YanickRochon це може мати сенс, якщо ви хочете об'єднати властивості двох об'єктів (у яких немає методу, вони просто використовуються як носій зберігання): у цьому випадку найшвидший і найпростіший шлях - перетворити обидва об'єкти в масиви, щоб застосувати array_replace_recursive () і повернутися на об'єкти після цього. Щодо того, чому хтось використовує об'єкт лише для зберігання властивостей, це часто трапляється в додатках, що отримують з баз даних, таких як MySQL, записи як об'єкт, а не масив (використовуючи стандартні функції, такі як mysql_fetch_object ()).
габоровий

1
@danorton FYI, оскільки 7.2 ви можете зробити unset($o->{0});або $k = 0; unset($o->$k);.
Сарк

43

Це також працює спеціально, якщо ви перебираєте певний предмет.

unset($object[$key])

Оновлення

Новіші версії PHP кидають фатальну помилку, Fatal error: Cannot use object of type Object as arrayяк згадує @CXJ. У такому випадку ви можете використовувати дужки замість цього

unset($object{$key})

Чи можете ви вказати, які "новіші" версії описані? Для мене з PHP 7.1 unset($object[$key])працює, а unset($object->{$key})не (якщо бути точнішим, так unset($object['literal_key'])і unset($object->{'literal_key'})). PS Хм, я можу помилятися, хоча, думаючи, що те, що я
редагую,

Не скидає властивість із колекції предметів.
Віктор

1

Це також працює, якщо ви перекидаєтеся на об’єкт.

unset($object->$key);

Не потрібно використовувати дужки.


2
Це питання не додає нічого нового порівняно з питанням @ YannickRochon.
helvete
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.