Можно ли удалить свойство объекта в PHP?

196

Если я stdObjectскажу $a.

Конечно, нет проблем с назначением нового свойства $a,

$a->new_property = $xyz;

Но потом я хочу удалить его, так что здесь unsetэто не поможет.

Так,

$a->new_property = null;

вроде как. Но есть ли более «элегантный» способ?

Валк
источник
Можете ли вы опубликовать код, как вы пытались с unset? В моем смысле unset должен работать. Но возможно вы дублируете контекст
Arshdeep
на самом деле не уверен, что unset () более элегантно, чем = null, но может быть, это только я
Роберт Синклер

Ответы:

356
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. ;-)
Данортон
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 Хм, я могу ошибаться, хотя, думая, что я редактирую, это объект, а не массив
YakovL
Не сбрасывает свойство из коллекции объектов.
Виктор Жорас
1

Это также работает, если вы зацикливаетесь на объекте.

unset($object->$key);

Нет необходимости использовать скобки.

dandyboh
источник
2
Этот вопрос не добавляет ничего нового по сравнению с вопросом @ YannickRochon.
Helvete