É possível excluir a propriedade de um objeto no PHP?

194

Se eu tenho uma stdObjectpalavra a dizer $a,.

Claro que não há nenhum problema para atribuir uma nova propriedade, $a,

$a->new_property = $xyz;

Mas então eu quero removê-lo, por isso unsetnão ajuda em nada aqui.

Assim,

$a->new_property = null;

é meio que isso. Mas existe uma maneira mais "elegante"?

valk
fonte
Você pode postar o código como você tentou com o unset? Em meu sentir unset deve work.But possivelmente você duplicar o contexto
Arshdeep
realmente não sei como unset () é mais elegante do que = null, mas pode ser que só eu
Robert Sinclair

Respostas:

351
unset($a->new_property);

Isso funciona para elementos de matriz, variáveis ​​e atributos de objeto.

Exemplo:

$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
fonte
10
Não é possível desarmar diretamente uma propriedade que possui uma chave inteira. por exemplo, $o=(object)array('a','b','c'); (Você tem que converter o objeto (de volta) para uma matriz até mesmo para simplesmente acessar essas propriedades!)
danorton
4
@YanickRochon, meu comentário é sobre um object, não um array. ;-)
danorton 21/03
1
@danorton Por que alguém, em sã consciência, converteria um arrayem um object? Isso simplesmente não faz sentido (mesmo que o PHP permita). Não vou encorage e espalharei maus hábitos de programação comentando isso :) Sem ofensas.
22614 Yanick Rochon
8
@YanickRochon isso pode fazer sentido se você deseja mesclar as propriedades de dois objetos (que não possuem método, eles apenas são usados ​​como meio de armazenamento): nesse caso, a rota mais rápida e mais simples é converter os dois objetos em matrizes para aplicar array_replace_recursive () e de volta aos objetos depois. Quanto ao motivo pelo qual alguém usaria um objeto para armazenar apenas propriedades, isso geralmente acontece em aplicativos que buscam em bancos de dados como MySQL os registros como um objeto em vez de uma matriz (usando funções padrão como mysql_fetch_object ()).
gaborous
1
@danorton FYI, desde 7.2 você pode fazer unset($o->{0});ou $k = 0; unset($o->$k);.
Sarke 12/06
43

Isso também funciona especialmente se você estiver fazendo um loop sobre um objeto.

unset($object[$key])

Atualizar

Versões mais recentes do PHP geram erros fatais, Fatal error: Cannot use object of type Object as arraycomo mencionado por @CXJ. Nesse caso, você pode usar colchetes

unset($object{$key})
Sajjad Ashraf
fonte
Você poderia especificar quais versões "mais recentes" são descritas? Para mim, o PHP 7.1 unset($object[$key])funciona e unset($object->{$key})não funciona (para ser mais preciso unset($object['literal_key'])e unset($object->{'literal_key'})). PS Hm, eu posso estar errado, porém, em pensar a coisa que eu estou editando é um objeto, não um array
YakovL
Não desmarca uma propriedade de uma coleção de objetos.
Viktor Joras
1

Isso também funciona se você estiver fazendo um loop sobre um objeto.

unset($object->$key);

Não há necessidade de usar colchetes.

dandyboh
fonte
2
Esta pergunta não adiciona nada de novo em comparação com a pergunta de @ YannickRochon.
helvete