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

val*_*alk 180 php object

如果我有stdObject发言权,$a.

当然,分配新房产没有问题$a,

$a->new_property = $xyz;
Run Code Online (Sandbox Code Playgroud)

但后来我想删除它,所以unset在这里没有任何帮助.

所以,

$a->new_property = null;
Run Code Online (Sandbox Code Playgroud)

有点像.但是有更"优雅"的方式吗?

Yan*_*hon 322

unset($a->new_property);
Run Code Online (Sandbox Code Playgroud)

这适用于数组元素,变量和对象属性

**编辑**

我不知道你__CODE__是怎么用的,但这就是它对我有用的方式:

$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())
Run Code Online (Sandbox Code Playgroud)

  • nb无法直接取消设置具有整数键的属性.例如`$ o =(object)array('a','b','c');`(你必须将对象(后面)转换为一个数组,甚至只需要_access_这样的属性!) (9认同)
  • @YanickRochon如果要合并两个对象的属性(没有方法,它们只是用作存储介质),这是有意义的:在这种情况下,最快和最简单的路径是将两个对象转换为数组以应用array_replace_recursive ()然后回到物体上.至于为什么有人会使用一个对象只存储属性,这通常发生在从数据库(如MySQL)获取记录作为对象而不是数组的应用程序中(使用标准函数,如mysql_fetch_object()). (7认同)
  • @YanickRochon,我的评论是关于`object`,而不是`array`.;-) (4认同)
  • @danorton 为什么有人会在他们正常的头脑中将“数组”转换为“对象”?它只是没有意义(即使 PHP 允许)。我不会通过对此发表评论来鼓励和传播不良的编程习惯 :) 没有冒犯。 (2认同)
  • @danorton仅供参考,从 7.2 开始,您可以执行 `unset($o->{0});` 或 `$k = 0; 取消设置($o->$k);`。 (2认同)

Saj*_*raf 38

如果您循环对象,这也特别有用.

unset($object[$key])
Run Code Online (Sandbox Code Playgroud)

更新

较新版本的PHP会抛出致命错误,Fatal error: Cannot use object of type Object as array如@CXJ所述.在这种情况下,您可以使用括号代替

unset($object{$key})
Run Code Online (Sandbox Code Playgroud)