php - 重置/清除对象?

Joe*_*Joe 19 php

我要做的是使用临时对象来存储值,然后将其重置为空而不必使用($ 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();
}
Run Code Online (Sandbox Code Playgroud)

有人有主意吗?

Nik*_*kiC 27

class Object {
    function ResetObject() {
        foreach ($this as $key => $value) {
            unset($this->$key);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请参阅:对象迭代

  • 取消设置属性与将其设置为null不同.默认情况下,属性为null,因此最好将它们设置为null.有关更多详细信息和代码,请参阅下面的答案. (2认同)

Mat*_*wne 21

该接受的答案有一个小小的瑕疵这是你重置一个属性实际上完全从该对象中删除,因此像一张支票$this->someProperty == null将触发一个"未定义的属性"的通知.默认情况下,属性为null,因此这更正确:

class Object {
    function resetObject() {
        foreach ($this as $key => $value) {
            $this->$key = null;  //set to null instead of unsetting
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一些属性可能已被赋予默认值(例如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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这可能有点矫枉过正,但在某些情况下可能很重要.请注意,如果类需要构造函数参数,则会失败; 在这种情况下,您可以使用ReflectionClass :: newInstanceWithoutConstructor(在PHP 5.4中引入),然后__construct()在调用后手动调用resetObject().