Apakah mungkin untuk menghapus properti objek di PHP?


194

Jika saya memiliki stdObjectsuara $a,.

Tentu tidak ada masalah untuk menetapkan properti baru $a,,

$a->new_property = $xyz;

Tapi kemudian saya ingin menghapusnya, jadi unsettidak ada gunanya di sini.

Begitu,

$a->new_property = null;

semacam itu. Tetapi apakah ada cara yang lebih 'elegan'?


Bisakah Anda memposting kode bagaimana Anda mencoba dengan tidak disetel? Dalam pengertian saya tidak disetel harus bekerja. Tetapi mungkin Anda menduplikasi konteks
Arshdeep

benar-benar tidak yakin bagaimana unset () lebih elegan dari = null, tetapi mungkin itu hanya saya
Robert Sinclair

Jawaban:


351
unset($a->new_property);

Ini berfungsi untuk elemen array, variabel, dan atribut objek.

Contoh:

$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 Tidak mungkin untuk langsung mengeset properti yang memiliki kunci integer. mis. $o=(object)array('a','b','c'); (Anda harus mengonversi objek (kembali) ke array bahkan hanya dengan mengakses properti seperti itu!)
danorton

4
@YanickRochon, komentar saya tentang object, bukan array. ;-)
danorton

1
@danorton mengapa seseorang, dalam pikiran waras mereka, mengubah sebuah arraymenjadi object? Itu tidak masuk akal (bahkan jika PHP mengizinkannya). Saya tidak akan mengatur dan menyebarkan kebiasaan pemrograman yang buruk dengan mengomentari ini :) Jangan tersinggung.
Yanick Rochon

8
@YanickRochon ini masuk akal jika Anda ingin menggabungkan properti dari dua objek (yang tidak memiliki metode, mereka hanya digunakan sebagai media penyimpanan): dalam hal ini, rute tercepat dan paling sederhana adalah untuk mengubah kedua objek menjadi array untuk menerapkan array_replace_recursive () dan kembali ke objek sesudahnya. Mengenai mengapa seseorang hanya akan menggunakan objek untuk menyimpan properti, ini sering terjadi dalam aplikasi yang mengambil dari database seperti MySQL catatan sebagai objek alih-alih array (menggunakan fungsi standar seperti mysql_fetch_object ()).
Gaborous

1
@danorton FYI, karena 7.2 dapat Anda lakukan unset($o->{0});atau $k = 0; unset($o->$k);.
Sarke

43

Ini juga bekerja secara khusus jika Anda mengulang-ulang suatu objek.

unset($object[$key])

Memperbarui

Versi PHP yang lebih baru melempar kesalahan fatal Fatal error: Cannot use object of type Object as arrayseperti yang disebutkan oleh @CXJ. Jika demikian, Anda dapat menggunakan tanda kurung

unset($object{$key})

Bisakah Anda menentukan versi "baru" yang dijelaskan? Bagi saya, dengan PHP 7.1 unset($object[$key])berfungsi dan unset($object->{$key})tidak (lebih tepatnya, unset($object['literal_key'])dan unset($object->{'literal_key'})). PS Hm, saya mungkin salah, dalam berpikir bahwa hal yang saya edit adalah objek, bukan array
YakovL

Tidak membatalkan properti dari kumpulan objek.
Viktor Joras

1

Ini juga berfungsi jika Anda mengulang-ulang suatu objek.

unset($object->$key);

Tidak perlu menggunakan tanda kurung.


2
Pertanyaan ini tidak menambahkan sesuatu yang baru dibandingkan dengan @ YannickRochon.
helvete
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.