2011-03-19 77 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);