2011-03-19 87 views
13

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

谢谢! :)

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

+0

我想你可能想看看通过反射提供了一些可能性。不是100%,但Reflection类提供了一些全面的功能。另外,好奇; *为什么*? – Dan 2011-03-19 00:23:37

+0

你如何检查它是否被删除? isset?的var_dump? – NikiC 2011-03-19 00:24:05

+0

我在持久层中使用RedBean;它为Bean上的每个成员(一个对象)创建一个列。我使用的效用函数有一个剩余的成员变量;而不是重写效用函数,我宁愿删除有问题的成员变量。 – rinogo 2011-03-19 00:25:11

回答

15

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

unset($bean->field); 

不行的,因为->field虚拟属性。它不存在于课堂上。相反,它驻留在您无法访问的protected $bean->properties[]中。 RedBean仅实现用于检索和设置属性的神奇方法__get__set

这就是为什么unset()不起作用。它解除了在该位置从未存在的财产。

+2

只是谷歌搜索了这个,我的答案提出了...哈! :)对于有此问题的其他人,您可以尝试修补RedBean以允许在bean属性上调用unset()。在__set()魔术方法后插入这个: \t/* Magic Setter。取消特定属性的值。 */ \t public function __unset($ property){ \t \t unset($ this-> properties [$ property]); \t} – rinogo 2013-01-17 00:29:48

+0

Page down查看正确的答案。 – Colin 2013-03-11 09:33:59

1

可能unset()

+0

似乎不起作用。 :P(已经尝试过:) :) – rinogo 2011-03-19 00:20:15

+1

@rinogo:你是如何使用未设置的?请展示。 – mario 2011-03-19 00:24:14

+0

嗨,马里奥!我用它来以这种方式取消设置名为'old_index'的成员变量:“unset($ c-> old_index);” – rinogo 2011-03-19 00:50:29

10
$obj = new stdClass; 
$obj->answer = 42; 
print_r($obj); 
unset($obj->answer); 
print_r($obj); 

Works fine for me。你确定你做对了吗?

更新:

It also works在类中定义的属性:

class Foo { 
    public $bar = 42; 
} 

$obj = new Foo; 
print_r($obj); 
unset($obj->bar); 
print_r($obj); 
+0

是的,这也适用于我在PHP 5.3.2下的工作。还处理实际定义的类(包括删除定义的成员)。 – jesse 2011-03-19 00:47:00

+0

这太奇怪了,它不适合我!我想我在PHP 5.1.2上,如果这改变了任何事情......:P – rinogo 2011-03-19 00:49:19

+0

它是一个动态属性,ala Jon的“答案”,还是一个在类定义中硬编码的属性?那些是不可能删除的。为什么你需要删除它? – 2011-03-19 00:58:54

4

内你反对,你可以定义一个名为__unset

class Test 
{ 
    public $data = array(); 

    public function __unset($key) 
    { 
     unset($this->data[$key]); 
    } 
} 

魔术方法和Jon总结了其他很好的因素。

3

RedBean在bean上有一个removeProperty方法。

+0

感谢您的评论!这应该对这个问题的新手有所帮助。我相信这在大约2011年初的RedBean中是不可用的(现在几乎是三年后)。实际上,回到当天(正如你在上面我的2013年1月17日的评论中可以看到的那样),我添加了一个magic setter来让unset()直接用在bean本身上。 – rinogo 2014-03-12 14:48:22

0

您是否想仅仅因为您的不想将其存储在数据库中而取消设置属性?

如果是这样,只需在该类中声明该属性为private即可。

荣誉对这样的回答:Not saving property of a php-redbean to database

+0

TBH,四年前我问过这个问题,所以我不记得。无论如何,谢谢你的回答!也许它会帮助别人! :) – rinogo 2015-02-06 16:45:42

1

随着红豆4,您可以使用

unset($bean->someproperty);