Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php-重置/清除对象?_Php - Fatal编程技术网

php-重置/清除对象?

php-重置/清除对象?,php,Php,我试图做的是使用一个临时对象来存储值,然后将其重置为空,而不必使用($tmpObject) 下面是一些示例代码: class Object { function ResetObject(){ // code to remove all variables in an object here? } } $tmpObject = new Object(); foreach ($myArray as $arr){ $tmpObject->val1 =

我试图做的是使用一个临时对象来存储值,然后将其重置为空,而不必使用($tmpObject)

下面是一些示例代码:

class Object {
    function ResetObject(){
        // code to remove all variables in an object here?
    }
}

$tmpObject = new Object();

foreach ($myArray as $arr){
    $tmpObject->val1 = "string1";
    $tmpObject->val2 = "string2";
    $tmpObject->val3 = "string3";
    $tmpObject->val4 = "string4";       
    $template->set('tmpObject',$tmpObject);
    $tmpObject->ResetObject();
}
有人有什么想法吗

class Object {
    function ResetObject() {
        foreach ($this as $key => $value) {
            unset($this->$key);
        }
    }
}

请参阅:

如果您的类有一个初始化所有内容的构造函数方法,那么您可以再次调用该方法进行重置。

重新初始化变量会将所有对象成员还原为其预设值

<?php

class Object {
  public $val1 = "val1";
  public $val2 = "val2";
}

$tmpObject = new Object();

$tmpObject->val1 = "string1";
$tmpObject->val2 = "string2";
$tmpObject->val3 = "string3";
$tmpObject->val4 = "string4";

var_dump($tmpObject);
$tmpObject = new Object();
var_dump($tmpObject);

?>

接受的答案有一个小缺陷,即取消设置属性实际上会将其从该对象中完全移除,因此类似于
$this->someProperty==null
的检查将触发“未定义属性”通知。默认情况下,属性为null,因此这更正确:

class Object {
    function resetObject() {
        foreach ($this as $key => $value) {
            $this->$key = null;  //set to null instead of unsetting
        }
    }
}
还有一种可能性是,某些属性可能已经给定了默认值(例如,
protected$someArray=array();
)…如果要将所有属性重置回其原始默认值,则必须使用反射:

class Object {
    function resetObject() {
        $blankInstance = new static; //requires PHP 5.3+  for older versions you could do $blankInstance = new get_class($this);
        $reflBlankInstance = new \ReflectionClass($blankInstance);
        foreach ($reflBlankInstance->getProperties() as $prop) {
            $prop->setAccessible(true);
            $this->{$prop->name} = $prop->getValue($blankInstance);
        }
    }
}
    private function resetPropertiesToDefault()
    {
        $blankInstance = $this->newInstance();
        $reflBlankInstance = new \ReflectionClass($blankInstance);
        foreach ($reflBlankInstance->getProperties() as $prop) {

            if ($prop->isStatic()) {
                continue;
            }

            $prop->setAccessible(true);

            $this->{$prop->name} = $prop->getValue($blankInstance);
        }
    }

这可能有些过分,但在某些情况下可能很重要。请注意,如果类具有必需的构造函数参数,则此操作将失败;在这种情况下,您可以使用(PHP5.4中介绍的),然后在调用
resetObject()


另一种将未设置和设置与默认值相结合的方式

class Object {
    public function resetObject()
    {
        $clean = new self;
        foreach ($this as $key => $val){

            // If the attribute have a default value, use it 
            if (isset($clean->$key)){
                $this->$key = $clean->$key;
            }else{
                unset($this->$key);
            }
        }
    }
}

与其取消设置,甚至设置为null,不如将其设置为default

class Foo {
public $bar = 'default bar';
private $baz = 'something';

  function __construct ()
  {
   /* assign whatever */
  }

 public function resetMe():Foo
 {
   $instance = new Foo();
   foreach($instance as $k => $v)
      $this->{$k} = $v;
 }
 return $this;
}
用这个

$foo = new Foo(); 
$foo->bar = 'set something different';
echo $foo->bar; // 'set something different'
$foo->resetMe();
echo $foo->bar; // 'default bar'

您可以通过反射来实现这一点:

class Object {
    function resetObject() {
        $blankInstance = new static; //requires PHP 5.3+  for older versions you could do $blankInstance = new get_class($this);
        $reflBlankInstance = new \ReflectionClass($blankInstance);
        foreach ($reflBlankInstance->getProperties() as $prop) {
            $prop->setAccessible(true);
            $this->{$prop->name} = $prop->getValue($blankInstance);
        }
    }
}
    private function resetPropertiesToDefault()
    {
        $blankInstance = $this->newInstance();
        $reflBlankInstance = new \ReflectionClass($blankInstance);
        foreach ($reflBlankInstance->getProperties() as $prop) {

            if ($prop->isStatic()) {
                continue;
            }

            $prop->setAccessible(true);

            $this->{$prop->name} = $prop->getValue($blankInstance);
        }
    }


这实际上是有缺陷的,您必须使用
foreach($key=>$property){unset($this->$key);}
我编辑了您的答案,添加一些函数来模拟对象。我们可能在
\uu construct
上设置了某些属性,但不想丢失它。取消设置属性与将其设置为null不同。属性默认为null,因此最好将其设置为null。有关更多详细信息和代码,请参阅下面我的答案。结合使用抽象类和子类的小说明。当调用抽象类内的重置函数以重置子类的属性时,扩展抽象的类;子类的属性必须至少受到保护。否则重置函数将看不到属性,也不会重置它们。他希望使用重置对象属性的函数。这通常用于MVCHow中的模型。是否取消设置(或设置为null)未由
get\u class\u vars(…)
检索的变量?op不希望将变量设置为默认值,op希望将其取消设置?我建议您在回答中添加一些解释,这样其他人就可以更好地理解您所做的事情。我认为您的反射方法实际上可能适用于实现“IteratorAggregate”的类,并将该方法应用于该类的单个数组属性。对于这些类,通过
foreach($this)
循环只会通过一个属性。然而,反射似乎会在所有属性中循环。但是类的静态属性呢?我认为重置静态属性是一个与问题中描述的完全不同的目标。每个静态属性只有一个副本-没有涉及实例-因此我不确定重置静态属性的动机是什么。我一定是睡眠不足,当然你对静态属性的看法是正确的。请注意,将此与抽象类和子类结合使用。当调用抽象类内的重置函数以重置子类的属性时,扩展抽象的类;子类的属性必须至少受到保护。否则重置函数将看不到属性,也不会重置它们。这似乎对静态属性不起作用。我们不想更改静态属性。