PHP'de bir nesnenin özelliğini silmek mümkün mü?


196

Eğer bir stdObjectsözüm varsa $a.

Elbette yeni bir mülk atamada sorun yok $a,

$a->new_property = $xyz;

Ama sonra kaldırmak istiyorum, bu yüzden unsetburada bir faydası yok.

Yani,

$a->new_property = null;

bir tür. Ama daha 'zarif' bir yol var mı?


Unset ile nasıl denediğinize kod gönderebilir misiniz? Benim açımdan unset çalışmalı.Ama muhtemelen bağlamı çoğaltırsınız
Arshdeep

unset () yönteminin = null değerinden daha zarif olduğundan emin değilim, ama bu sadece ben olabilirim
Robert Sinclair

Yanıtlar:


355
unset($a->new_property);

Bu, dizi öğeleri, değişkenler ve nesne nitelikleri için çalışır.

Misal:

$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 Tamsayı anahtarı olan bir özelliği doğrudan ayarlamak mümkün değildir. örn. $o=(object)array('a','b','c'); (Bu tür özelliklere erişmek için bile nesneyi (geri) bir diziye dönüştürmelisiniz !)
danorton

4
@YanickRochon, yorumum bir objectdeğil, bir array. ;-)
danorton

1
@danorton neden birisi, akıllarında, bir array'i an' a dönüştürür object? Sadece mantıklı değil (PHP izin verse bile). Bu konuda yorum yaparak kötü programlama alışkanlıklarını zorlayıp yaymayacağım :) Suç yok.
Yanick Rochon

8
@YanickRochon, iki nesnenin özelliklerini (yöntemi olmayan, sadece depolama ortamı olarak kullanılır) birleştirmek istiyorsanız mantıklı olabilir: bu durumda, en hızlı ve en basit yol, array_replace_recursive uygulamak için her iki nesneyi dizilere dönüştürmektir. () ve daha sonra nesnelere geri dönün. Birisinin neden sadece özellikleri depolamak için bir nesne kullanmasıyla ilgili olarak, bu genellikle MySQL gibi veritabanlarından kayıtları bir dizi yerine bir nesne olarak (mysql_fetch_object () gibi standart işlevleri kullanarak) getiren uygulamalarda olur.
gaborous

1
@danorton FYI, 7.2'den beri yapabilirsiniz unset($o->{0});veya $k = 0; unset($o->$k);.
Sarke

43

Bu, özellikle bir nesnenin üzerinde döngü yapıyorsanız da çalışır.

unset($object[$key])

Güncelleme

Fatal error: Cannot use object of type Object as array@CXJ tarafından belirtildiği gibi PHP'nin daha yeni sürümleri ölümcül hata veriyor. Bu durumda parantez kullanabilirsiniz

unset($object{$key})

Hangi "yeni" sürümlerin açıklanacağını belirtebilir misiniz? PHP 7.1 ile benim için unset($object[$key])çalışıyor ve unset($object->{$key})çalışmıyor (daha kesin olmak gerekirse, unset($object['literal_key'])ve unset($object->{'literal_key'})). PS Hm, yine de yanlış olabilirim,
düzenlediğim şeyin

Bir özelliği bir nesne koleksiyonundan ayırmaz.
Viktor Joras

1

Bu, bir nesnenin üzerinde döngü yapıyorsanız da çalışır.

unset($object->$key);

Parantez kullanmaya gerek yok.


2
Bu soru @ YannickRochon'unkine kıyasla yeni bir şey eklemiyor.
helvete
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.