从对象中删除成员?

rin*_*ogo 13 php attributes class

有没有一种简单的方法从对象中删除成员?不只是将其设置为null,而是实际将其删除.

谢谢!:)

编辑:我已经尝试过unset(),并且将成员变量设置为null显然不起作用.我想我可以将对象转换为数组,然后删除有问题的数组键,并转换回一个对象,但是发誓......必须有一个更简单的方法!

mar*_*rio 16

您正在使用RedBean.刚检查出来.而这些bean对象没有实际属性.

unset($bean->field);
Run Code Online (Sandbox Code Playgroud)

不起作用,因为它->field是一个虚拟属性.它在课堂上不存在.相反,它位于protected $bean->properties[]您无法访问的位置.RedBean仅实现魔术方法__get以及__set检索和设置属性.

这就是为什么unset()不起作用的原因.它取消了在该位置从未存在过的属性.

  • 再次谷歌搜索,我的回答出现了......哈!:)对于遇到此问题的其他人,您可以尝试修补RedBean以允许在bean属性上调用unset().在__set()魔术方法之后插入:/*Magic Setter.取消设置特定属性的值.*/public function __unset($ property){unset($ this-> properties [$ property]); } (2认同)

Jon*_*Jon 10

$obj = new stdClass;
$obj->answer = 42;
print_r($obj);
unset($obj->answer);
print_r($obj);
Run Code Online (Sandbox Code Playgroud)

对我来说很好.你确定你做得对吗?

更新:

它也适用于类中定义的属性:

class Foo {
    public $bar = 42;
}

$obj = new Foo;
print_r($obj);
unset($obj->bar);
print_r($obj);
Run Code Online (Sandbox Code Playgroud)


Rob*_*itt 5

在您的对象中,您可以定义一个名为 __unset

class Test
{
    public $data = array();

    public function __unset($key)
    {
        unset($this->data[$key]);
    }
}
Run Code Online (Sandbox Code Playgroud)

乔恩很好地总结了其他因素。