是否可以在PHP中删除对象的属性?


193

如果我有stdObject发言权,$a

当然,分配新属性没有问题$a

$a->new_property = $xyz;

但是之后我想将其删除,因此unset这里无济于事。

所以,

$a->new_property = null;

是这样的。但是,还有一种更“优雅”的方式吗?


您可以张贴代码如何尝试使用unset吗?从我的角度来看,未设置应该起作用。但是可能您要复制上下文
Arshdeep

真的不确定unset()是否比= null更优雅,但这可能只是我
罗伯特·辛克莱

Answers:


350
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 2014年

4
@YanickRochon,我的评论是关于object而不是array。;-)
danorton 2014年

1
@danorton为什么有人在他们的正确思想中将an转换array为an object?只是没有意义(即使PHP允许)。我不会对此发表评论,以掩饰和散布不良的编程习惯:)没有冒犯。
Yanick Rochon 2014年

8
@YanickRochon如果要合并两个对象的属性(没有方法,它们仅用作存储介质),这可能很有意义:在这种情况下,最快和最简单的方法是将两个对象都转换为数组以应用array_replace_recursive (),然后再返回对象。至于为什么有人会使用对象来仅存储属性,这种情况经常发生在从数据库(例如MySQL)获取记录作为对象而不是数组(使用标准函数,例如mysql_fetch_object())的应用程序中。
2015年

1
@danorton仅供参考,从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 Hm,但是,在认为我正在编辑的对象是对象而不是数组时,我可能错了
YakovL

不会从对象集合中取消设置属性。
维克多·乔拉斯

1

如果要遍历对象,这也可以使用。

unset($object->$key);

无需使用括号。


2
与@YannickRochon的问题相比,此问题没有添加任何新内容。
helvete
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.