【问题标题】:Is it possible to delete an object's property in PHP?是否可以在 PHP 中删除对象的属性?
【发布时间】:2011-04-05 18:30:33
【问题描述】:

如果我有一个stdObject,比如说$a

确定分配新属性没有问题,$a

$a->new_property = $xyz;

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

所以,

$a->new_property = null;

有点像。但是有没有更“优雅”的方式呢?

【问题讨论】:

  • 你能发布你如何尝试使用 unset 的代码吗?在我的意义上 unset 应该可以工作。但可能你复制了上下文
  • 真的不确定 unset() 比 = null 更优雅,但可能就是我自己

标签: php object


【解决方案1】:
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())

【讨论】:

  • n.b.无法直接取消设置具有整数键的属性。例如$o=(object)array('a','b','c');(您必须将对象(返回)转换为数组,即使只是访问这样的属性!)
  • @YanickRochon,我的评论是关于object,而不是array。 ;-)
  • @danorton 为什么有人会在正常情况下将array 转换为object?这毫无意义(即使 PHP 允许)。我不会通过对此发表评论来鼓励和传播不良的编程习惯:) 无意冒犯。
  • @YanickRochon 如果你想合并两个对象的属性(没有方法,它们只是用作存储介质),这可能是有意义的:在这种情况下,最快和最简单的方法是将两个对象转换为数组以应用 array_replace_recursive() 并在之后返回对象。至于为什么有人会使用对象仅存储属性,这通常发生在应用程序从 MySQL 等数据库中获取记录作为对象而不是数组(使用标准函数,如 mysql_fetch_object())。
  • @danorton 仅供参考,从 7.2 开始,您可以使用 unset($o->{0});$k = 0; unset($o->$k);
【解决方案2】:

如果你在一个对象上循环,这也特别有效。

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 嗯,我可能错了,我认为我正在编辑的东西是一个对象,而不是一个数组
  • 不从对象集合中取消设置属性。
【解决方案3】:

这也适用于循环对象。

unset($object->$key);

不需要使用括号。

【讨论】:

  • 与@YannickRochon 的问题相比,这个问题并没有增加任何新内容。
【解决方案4】:

这段代码在循环中对我来说很好用

$remove = array(
    "market_value",
    "sector_id"
);

foreach($remove as $key){
    unset($obj_name->$key);
}

【讨论】:

  • 您的答案使用array,但问题是关于stdClass 对象。你说的没有错,但与问题无关。
【解决方案5】:

设置元素为null 只需将元素的值设置为null 元素仍然存在

取消设置元素意味着删除元素 它适用于数组、stdClass 对象用户定义的类以及任何变量

<?php
    $a = new stdClass();
    $a->one = 1;
    $a->two = 2;
    var_export($a);
    unset($a->one);
    var_export($a);
    
    class myClass
    {
        public $one = 1;
        public $two = 2;
    }
    
    $instance = new myClass();
    var_export($instance);
    unset($instance->one);
    var_export($instance);
    
    $anyvariable = 'anyValue';
    var_export($anyvariable);
    unset($anyvariable);
    var_export($anyvariable);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 2020-04-10
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    相关资源
    最近更新 更多