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'?

Valk
sumber
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())
Yanick Rochon
sumber
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})
Sajjad Ashraf
sumber
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.

dandyboh
sumber
2
Pertanyaan ini tidak menambahkan sesuatu yang baru dibandingkan dengan @ YannickRochon.
helvete