เป็นไปได้ที่จะลบคุณสมบัติของวัตถุใน PHP?


196

ถ้าฉันมีคำstdObjectพูด$a.

ตรวจสอบว่ามีปัญหาไม่มีการกำหนดคุณสมบัติใหม่$a,

$a->new_property = $xyz;

แต่ฉันต้องการลบออกดังนั้นจึงunsetไม่มีความช่วยเหลือที่นี่

ดังนั้น,

$a->new_property = null;

เป็นชนิดของมัน แต่มีวิธีที่ 'สง่างาม' มากกว่านี้ไหม


คุณสามารถโพสต์รหัสวิธีที่คุณพยายามตั้งค่าอย่างไร? ในแง่ของฉัน unset ควรทำงาน แต่คุณอาจทำซ้ำบริบท
Arshdeep

ไม่แน่ใจจริงๆว่า unset () นั้นงดงามกว่า = null แต่อาจเป็นเพียงฉัน
Robert Sinclair

คำตอบ:


355
unset($a->new_property);

ใช้งานได้กับองค์ประกอบอาร์เรย์ตัวแปรและแอตทริบิวต์ของวัตถุ

ตัวอย่าง:

$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 ไม่สามารถยกเลิกการตั้งค่าคุณสมบัติที่มีคีย์จำนวนเต็มโดยตรง เช่น$o=(object)array('a','b','c'); (คุณต้องแปลงวัตถุ (ด้านหลัง) ไปยังอาร์เรย์แม้จะเป็นเพียงการเข้าถึงคุณสมบัติดังกล่าว!)
danorton

4
@YanickRochon, ความคิดเห็นของฉันเป็นเรื่องเกี่ยวกับไม่ใช่object array;-)
danorton

1
@danorton ทำไมถึงมีใครบางคนในใจที่ถูกต้องของพวกเขาเปลี่ยนarrayเป็นobject? มันไม่สมเหตุสมผล (แม้ว่า PHP จะอนุญาต) ฉันจะไม่ encorage และแพร่กระจายนิสัยการเขียนโปรแกรมที่ไม่ดีโดยการแสดงความคิดเห็นในนี้ :) ไม่มีความผิด
Yanick Rochon

8
@ YanickRochon สิ่งนี้สมเหตุสมผลถ้าคุณต้องการรวมคุณสมบัติของวัตถุสองอย่าง (ที่ไม่มีวิธีการพวกมันถูกใช้เป็นสื่อกลางในการจัดเก็บ): ในกรณีนี้เส้นทางที่เร็วและง่ายที่สุดคือการเปลี่ยนวัตถุทั้งสองเป็นอาร์เรย์เพื่อใช้ array_replace_recursive () และกลับสู่วัตถุหลังจากนั้น สำหรับสาเหตุที่บางคนใช้วัตถุเพื่อจัดเก็บคุณสมบัติเท่านั้นสิ่งนี้มักเกิดขึ้นในแอปพลิเคชันที่ดึงมาจากฐานข้อมูลเช่น MySQL บันทึกเป็นวัตถุแทนที่จะเป็นอาร์เรย์ (ใช้ฟังก์ชันมาตรฐานเช่น mysql_fetch_object ())
gaborous

1
@danorton FYI ตั้งแต่ 7.2 คุณสามารถทำได้หรือunset($o->{0}); $k = 0; unset($o->$k);
Sarke

43

วิธีนี้จะทำงานเป็นพิเศษหากคุณวนลูปวัตถุ

unset($object[$key])

ปรับปรุง

PHP เวอร์ชันใหม่กว่ามีข้อผิดพลาดร้ายแรงFatal error: Cannot use object of type Object as arrayตามที่ระบุไว้โดย @CXJ ในกรณีนี้คุณสามารถใช้วงเล็บแทน

unset($object{$key})

คุณสามารถระบุรุ่นที่ "ใหม่กว่า" ได้หรือไม่ สำหรับฉันด้วย PHP 7.1 unset($object[$key])ทำงานได้และunset($object->{$key})ไม่ได้ (จะแม่นยำมากขึ้นunset($object['literal_key'])และunset($object->{'literal_key'})) PS หืมมฉันอาจจะผิด แต่ในการคิดว่าสิ่งที่ฉันแก้ไขเป็นวัตถุไม่ใช่อาร์เรย์
YakovL

ห้ามยกเลิกการตั้งค่าคุณสมบัติจากชุดของวัตถุ
Viktor Joras

1

สิ่งนี้จะทำงานหากคุณวนลูปวัตถุ

unset($object->$key);

ไม่จำเป็นต้องใช้วงเล็บ


2
คำถามนี้ไม่ได้เพิ่มอะไรใหม่เมื่อเปรียบเทียบกับ @ YannickRochon
helvete
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.