È possibile eliminare la proprietà di un oggetto in PHP?


196

Se ho un stdObjectesempio, $a.

Certo non c'è nessun problema di assegnare una nuova proprietà, $a,

$a->new_property = $xyz;

Ma poi voglio rimuoverlo, quindi non unsetè di alcun aiuto qui.

Così,

$a->new_property = null;

è gentile. Ma c'è un modo più "elegante"?


Puoi pubblicare il codice come hai provato con unset? Nel mio senso unset dovrebbe funzionare, ma forse stai duplicando il contesto
Arshdeep,

davvero non sono sicuro di quanto unset () sia più elegante di = null, ma forse sono solo io
Robert Sinclair,

Risposte:


355
unset($a->new_property);

Funziona con elementi di array, variabili e attributi di oggetti.

Esempio:

$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 Non è possibile disinserire direttamente una proprietà che ha una chiave intera. ad es. $o=(object)array('a','b','c'); (Devi convertire l'oggetto (indietro) in un array anche solo per accedere a tali proprietà!)
danorton

4
@YanickRochon, il mio commento riguarda an object, non an array. ;-)
danorton,

1
@danorton perché qualcuno, nella sua mente giusta, dovrebbe convertire un arrayin un object? Non ha senso (anche se PHP lo consente). Non incoraggerò e diffonderò cattive abitudini di programmazione commentando questo :) Senza offesa.
Yanick Rochon,

8
@YanickRochon questo può avere senso se vuoi unire le proprietà di due oggetti (che non hanno metodo, sono semplicemente usati come supporto di memorizzazione): in questo caso, il percorso più veloce e più semplice è convertire entrambi gli oggetti in array per applicare array_replace_recursive () e poi di nuovo sugli oggetti. Per quanto riguarda il motivo per cui qualcuno dovrebbe utilizzare un oggetto per archiviare solo le proprietà, ciò accade spesso nelle applicazioni che recuperano da database come MySQL i record come oggetto anziché un array (utilizzando funzioni standard come mysql_fetch_object ()).
Gaborous,

1
@danorton FYI, dal 7.2 puoi fare unset($o->{0});o $k = 0; unset($o->$k);.
Sarke,

43

Questo funziona anche specialmente se stai eseguendo il loop su un oggetto.

unset($object[$key])

Aggiornare

Le versioni più recenti di PHP generano un errore fatale, Fatal error: Cannot use object of type Object as arraycome menzionato da @CXJ. In tal caso è possibile utilizzare invece le parentesi

unset($object{$key})

Potresti specificare quali versioni "più recenti" sono descritte? Per me, con PHP 7.1 unset($object[$key])funziona e unset($object->{$key})non funziona (per essere più precisi unset($object['literal_key'])e unset($object->{'literal_key'})). PS Hm, potrei sbagliarmi, però, nel pensare che la cosa che sto modificando sia un oggetto, non un array
YakovL

Non disinserisce una proprietà da una raccolta di oggetti.
Viktor Joras,

1

Questo funziona anche se si esegue il loop su un oggetto.

unset($object->$key);

Non è necessario utilizzare le parentesi.


2
Questa domanda non aggiunge nulla di nuovo rispetto a quella di @ YannickRochon.
Helvete
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.