【问题标题】:Removing private properties of object删除对象的私有属性
【发布时间】:2011-08-12 10:49:44
【问题描述】:

尝试并搜索了这个,但似乎从未在 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] => 
)

现在我希望完全删除那些未设置的属性 我再次尝试取消设置,但它似乎不起作用

感谢所有愿意回答这个问题的人

【问题讨论】:

  • 陈规定型问题。你为什么想做这样的事情?必须有更好的解决方案。
  • 你必须预先定义它们吗?
  • my_obj 将是其实现的模板,目标对象实现将包含特定属性而不是全部,因此如果属性很高,那么我们将携带整个属性集而不是子集在使用构造函数设置的那些中,我将实现它类似于 $a = new my_obj(array('a'=&gt;'a'))$ab = new my_obj(array('a'=&gt;'a','b'=&gt;'b')) 和类似 $abd = new my_obj(array('a'=&gt;'a','b'=&gt;'b','d'=&gt;'d'));

标签: php oop


【解决方案1】:

除了有更好的方法来做你需要的任何事情之外(你应该在另一个问题中解释你需要解决的问题,以便我们可以帮助你找到更好的解决方案),您确实可以删除私有财产,只要您在可以访问它们的上下文中执行此操作。

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) { }

【讨论】:

  • $var->deleteProp() 当然不是 $var->delete(),不能编辑。
【解决方案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

已编辑:纠正错字

【讨论】:

  • 这个问题中的所有属性都是私有的,所以这个解决方案是行不通的。
  • 我读过诸如线程开启器试图从对象中删除私有属性的问题。如果所有属性都是私有的,那么结果对象应该是空的(虽然还没有测试过)。但是,上述方法不会保留对象方法。如果您对此感到担忧,则必须提供一些额外的代码。
猜你喜欢
  • 2021-02-24
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 2018-02-21
  • 2021-10-10
  • 1970-01-01
相关资源
最近更新 更多