Có thể xóa thuộc tính của một đối tượng trong PHP không?


193

Nếu tôi có stdObjecttiếng nói , $a.

Chắc chắn không có vấn đề gì để gán một tài sản mới $a,

$a->new_property = $xyz;

Nhưng sau đó tôi muốn loại bỏ nó, vì vậy unsetkhông có sự giúp đỡ ở đây.

Vì thế,

$a->new_property = null;

là loại của nó Nhưng có cách nào 'thanh lịch' hơn không?


Bạn có thể gửi mã làm thế nào bạn đã cố gắng với unset? Theo nghĩa của tôi, unset nên hoạt động. Nhưng có thể bạn nhân đôi bối cảnh
Arshdeep

thực sự không chắc chắn làm thế nào unset () thanh lịch hơn = null, nhưng có thể đó chỉ là tôi
Robert Sinclair

Câu trả lời:


350
unset($a->new_property);

Điều này làm việc cho các phần tử mảng, biến và thuộc tính đối tượng.

Thí dụ:

$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 Không thể trực tiếp hủy đặt thuộc tính có khóa số nguyên. ví dụ: $o=(object)array('a','b','c'); (Bạn phải chuyển đổi đối tượng (trở lại) thành một mảng thậm chí để truy cập các thuộc tính như vậy!)
danorton

4
@YanickRhol, nhận xét của tôi là về một object, không phải một array. ;-)
danorton

1
@danorton tại sao một người nào đó, trong suy nghĩ đúng đắn của họ, chuyển đổi arraythành một object? Nó chỉ vô nghĩa (ngay cả khi PHP cho phép nó). Tôi sẽ không lưu trữ và lan truyền thói quen lập trình xấu bằng cách bình luận về điều này :) Không xúc phạm.
Yanick Rochon

8
@YanickRhol điều này có thể có ý nghĩa nếu bạn muốn hợp nhất các thuộc tính của hai đối tượng (không có phương thức, chúng chỉ được sử dụng làm phương tiện lưu trữ): trong trường hợp này, cách nhanh nhất và đơn giản nhất là chuyển đổi cả hai đối tượng thành mảng để áp dụng mảng numplace_recursive () và trở lại vào các đối tượng sau đó. Về lý do tại sao một người nào đó sẽ sử dụng một đối tượng để chỉ lưu trữ các thuộc tính, điều này thường xảy ra trong các ứng dụng tìm nạp từ cơ sở dữ liệu như MySQL các bản ghi dưới dạng một đối tượng thay vì một mảng (sử dụng các hàm tiêu chuẩn như mysql_fetch_object ()).
rầm rộ

1
@danorton FYI, kể từ 7.2 bạn có thể làm unset($o->{0});hoặc $k = 0; unset($o->$k);.
Sarke

43

Điều này cũng hoạt động đặc biệt nếu bạn đang lặp qua một đối tượng.

unset($object[$key])

Cập nhật

Các phiên bản mới hơn của PHP ném lỗi nghiêm trọng Fatal error: Cannot use object of type Object as arraynhư được đề cập bởi @CXJ. Trong trường hợp đó, bạn có thể sử dụng dấu ngoặc thay thế

unset($object{$key})

Bạn có thể chỉ định phiên bản "mới hơn" được mô tả? Đối với tôi, với PHP 7.1 unset($object[$key])hoạt động và unset($object->{$key})không (chính xác hơn, unset($object['literal_key'])unset($object->{'literal_key'})). PS Hừ, tôi có thể sai, tuy nhiên, khi nghĩ rằng thứ tôi đang chỉnh sửa là một vật thể, không phải là một mảng
YakovL

Không bỏ đặt một thuộc tính từ một bộ sưu tập các đối tượng.
Viktor Joras

1

Điều này cũng hoạt động nếu bạn đang lặp qua một đối tượng.

unset($object->$key);

Không cần sử dụng dấu ngoặc.


2
Câu hỏi này không thêm bất cứ điều gì mới so với câu hỏi của @ YannickRhol.
trực thăng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.