php - 重置/清除对象?

php
2022-08-30 18:49:28

我试图做的是使用一个临时对象来存储值,然后将其重置为空,而不必uset($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();
}

有人有什么想法吗?


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

请参见: 对象小版本


答案 2

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

这可能有些过分,但在某些情况下可能很重要。请注意,如果类具有所需的构造函数参数,这将失败;在这种情况下,您可以使用ReflemClass::newInstanceWithoutConstructor(在PHP 5.4中引入),然后在调用后手动调用。__construct()resetObject()


推荐