2011-08-12 110 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

我读过这个问题,例如线程开启器试图从对象中移除私有属性。如果所有属性都是私有的,则所得到的对象应该是空的(尽管如此,还没有对其进行测试)。 虽然上面提到的方法不会保留对象的方法。如果这是令人担忧的,你必须想出一些额外的代码。 –