Est-il possible de supprimer la propriété d'un objet en PHP?

212

Si j'ai un stdObjectmot à dire, $a.

Bien sûr , il n'y a pas de problème d'attribuer une nouvelle propriété, $a,

$a->new_property = $xyz;

Mais ensuite, je veux le supprimer, ce unsetn'est donc d'aucune utilité ici.

Donc,

$a->new_property = null;

est en quelque sorte. Mais y a-t-il une manière plus «élégante»?

valk
la source
Pouvez-vous publier le code que vous avez essayé avec unset? Dans mon sens, unset devrait fonctionner.Mais vous dupliquez peut-être le contexte
Arshdeep
vraiment pas sûr à quel point unset () est plus élégant que = null, mais peut-être que ce n'est que moi
Robert Sinclair

Réponses:

387
unset($a->new_property);

Cela fonctionne pour les éléments de tableau, les variables et les attributs d'objet.

Exemple:

$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
la source
10
nb Il n'est pas possible d'annuler directement une propriété qui a une clé entière. par exemple $o=(object)array('a','b','c'); (vous devez convertir l'objet (retour) en un tableau même pour accéder simplement à de telles propriétés!)
danorton
4
@YanickRochon, mon commentaire concerne un object, pas un array. ;-)
danorton
2
@danorton pourquoi quelqu'un, sain d'esprit, convertirait-il un arrayen un object? Cela n'a tout simplement aucun sens (même si PHP le permet). Je n'encouragerai pas et ne répandrai pas de mauvaises habitudes de programmation en commentant ceci :) Aucune offense.
Yanick Rochon
8
@YanickRochon cela peut avoir du sens si vous souhaitez fusionner les propriétés de deux objets (qui n'ont pas de méthode, ils sont juste utilisés comme support de stockage): dans ce cas, la voie la plus rapide et la plus simple consiste à convertir les deux objets en tableaux pour appliquer array_replace_recursive () et de nouveau sur les objets par la suite. Quant à savoir pourquoi quelqu'un utiliserait un objet pour stocker uniquement des propriétés, cela se produit souvent dans les applications récupérant des bases de données telles que MySQL les enregistrements en tant qu'objet au lieu d'un tableau (en utilisant des fonctions standard telles que mysql_fetch_object ()).
gaborous le
1
@danorton FYI, depuis 7.2 vous pouvez faire unset($o->{0});ou $k = 0; unset($o->$k);.
Sarke le
43

Cela fonctionne également spécialement si vous bouclez sur un objet.

unset($object[$key])

Mise à jour

Les nouvelles versions de PHP Fatal error: Cannot use object of type Object as arraygénèrent une erreur fatale comme mentionné par @CXJ. Dans ce cas, vous pouvez utiliser des crochets à la place

unset($object{$key})
Sajjad Ashraf
la source
Pouvez-vous préciser quelles versions «plus récentes» sont décrites? Pour moi, avec PHP 7.1 unset($object[$key])fonctionne et unset($object->{$key})ne fonctionne pas (pour être plus précis, unset($object['literal_key'])et unset($object->{'literal_key'})). PS Hm, je me trompe peut-être, cependant, en pensant que la chose que
j'édite
N'annule pas une propriété d'une collection d'objets.
Viktor Joras
1

Cela fonctionne également si vous bouclez sur un objet.

unset($object->$key);

Pas besoin d'utiliser des crochets.

dandyboh
la source
2
Cette question n'ajoute rien de nouveau par rapport à celle de @ YannickRochon.
helvete
0

Ce code fonctionne bien pour moi dans une boucle

$remove = array(
    "market_value",
    "sector_id"
);

foreach($remove as $key){
    unset($obj_name->$key);
}
Ashiq Dey
la source