¿Es posible eliminar la propiedad de un objeto en PHP?

196

Si tengo una stdObjectpalabra, $a.

Claro que no hay problema para asignar una nueva propiedad $a,

$a->new_property = $xyz;

Pero luego quiero eliminarlo, por unsetlo que no es de ayuda aquí.

Entonces,

$a->new_property = null;

es algo así ¿Pero hay una manera más 'elegante'?

valk
fuente
¿Puedes publicar código como lo intentaste con unset? En la mía sentido desarmado debe work.But posiblemente duplicar el contexto
Arshdeep
Realmente no estoy seguro de cómo unset () es más elegante que = nulo, pero puede ser que solo soy yo
Robert Sinclair

Respuestas:

353
unset($a->new_property);

Esto funciona para elementos de matriz, variables y atributos de objeto.

Ejemplo:

$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
fuente
10
nb No es posible desarmar directamente una propiedad que tenga una clave entera. por ejemplo $o=(object)array('a','b','c'); (¡Tiene que convertir el objeto (atrás) en una matriz, incluso para acceder simplemente a tales propiedades!)
danorton
44
@YanickRochon, mi comentario es sobre un object, no un array. ;-)
danorton
1
@danorton ¿por qué alguien, en su sano juicio, convertiría un arrayen un object? Simplemente no tiene sentido (incluso si PHP lo permite). No codificaré ni difundiré malos hábitos de programación al comentar sobre esto :) Sin ofender.
Yanick Rochon
8
@YanickRochon esto puede tener sentido si desea fusionar las propiedades de dos objetos (que no tienen método, solo se usan como medio de almacenamiento): en este caso, la ruta más rápida y simple es convertir ambos objetos en matrices para aplicar array_replace_recursive () y volver a los objetos después. En cuanto a por qué alguien usaría un objeto para almacenar solo propiedades, esto sucede a menudo en aplicaciones que obtienen de bases de datos como MySQL los registros como un objeto en lugar de una matriz (usando funciones estándar como mysql_fetch_object ()).
Gaborous
1
@danorton FYI, desde 7.2 puedes hacer unset($o->{0});o $k = 0; unset($o->$k);.
Sarke
43

Esto también funciona especialmente si está recorriendo un objeto.

unset($object[$key])

Actualizar

Las versiones más nuevas de PHP arrojan un error fatal Fatal error: Cannot use object of type Object as arraycomo lo menciona @CXJ. En ese caso, puedes usar corchetes

unset($object{$key})
Sajjad Ashraf
fuente
¿Podría especificar qué versiones "más nuevas" se describen? Para mí, con PHP 7.1 unset($object[$key])funciona y unset($object->{$key})no funciona (para ser más precisos, unset($object['literal_key'])y unset($object->{'literal_key'})). PS Hm, puedo estar equivocado, sin embargo, pensar en lo que estoy editando es un objeto, no una matriz
YakovL
No desarma una propiedad de una colección de objetos.
Viktor Joras
1

Esto también funciona si está recorriendo un objeto.

unset($object->$key);

No es necesario usar corchetes.

dandyboh
fuente
2
Esta pregunta no agrega nada nuevo en comparación con la de @ YannickRochon.
helvete