2011-08-12 148 views
3

嘗試並搜索這個,但從未在這裏似乎找到它SO 嘗試使用unset($this->property_name)但它仍然顯示時,我使用print_r($object_name),是不可能刪除對象的私有屬性?刪除對象的私有屬性

這裏是一個示例代碼

class my_obj 
{ 
    private $a, $b, $c, $d; 
    public function __construct($data = null) 
    { 
     if($data) 
     { 
      foreach($data as $key) 
      { 
       if(property_exists($this,$key)) 
       { 
        $this->$key = $value; 
       } 
      } 
     } 
    } 

實現:

$test = new my_obj(array('a'=>a, 'c'=>'c')); 
echo '<pre>',print_r($test,TRUE),'</pre>'; 

輸出會是這樣的

my_obj Object 
(
    [a:my_obje:private] => a 
    [b:my_obje:private] => 
    [c:my_obje:private] => c 
    [d:my_obje:private] => 
) 

現在我想,沒有設置這些屬性是完全刪除 再次,我試過未設置,它似乎不工作

感謝所有關心到的事實,我們有了更好的方法做你不管它是什麼,你需要這個(你應該解釋一下,你需要在另一個要解決的問題除了回答這個

+1

陳規定型的問題。你爲什麼想要做這樣的事情?必須有更好的解決方案。 –

+0

你必須預先定義它們嗎? –

+0

my_obj將成爲其實現的模板,目標對象實現將包含特定的屬性而不是整體,所以如果屬性會很高,那麼我們將攜帶整組屬性而不是使用構造函數,我會實現它像'$ a = new my_obj(array('a'=>'a'))'; '$ ab = new my_obj(array('a'=>'a','b'=>'b'))'和類似的東西'$ abd = new my_obj ,'b'=>'b','d'=>'d'));' – ianace

回答

4

問題以便我們可以幫助您找到更好的解決方案),只要您在可訪問它們的環境中進行操作,就可以確實刪除私有財產。

class test 
{ 
    private $prop = 'test'; 

    public function deleteProp() 
    { 
    unset($this->prop); 
    } 
} 

$var = new test(); 
var_dump($var); // object(test)#1 (1) {["prop":"test":private] => string(4) "test"} 
$var->deleteProp(); 
var_dump($var); // object(test)#1 (0) { } 
+0

$ var-> deleteProp()當然不是$ var-> delete(),不能編輯。 – yokoloko

+0

謝謝,修復 – Lepidosteus

2

如果你不介意創建一個新的對象,你可以使用PHP的內置get_object_vars():

$public_properties = get_object_vars($object); // get only the public properties of the object 
$public_properties = (object)$public_properties; // turn array back into object 

欲瞭解更多信息,請參閱http://php.net/manual/function.get-object-vars.php

編輯:糾正錯字

+0

此問題中的所有屬性都是私有的,所以此解決方案不起作用。 – lshas

+0

我讀過這個問題,例如線程開啓器試圖從對象中移除私有屬性。如果所有屬性都是私有的,則所得到的對象應該是空的(儘管如此,還沒有對其進行測試)。 雖然上面提到的方法不會保留對象的方法。如果這是令人擔憂的,你必須想出一些額外的代碼。 –