Php - reset/очистить объект?

То, что я пытаюсь сделать, это использовать временный объект для хранения значений, а затем reset он возвращается к пустому без необходимости использовать ($ 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

Принятый ответ имеет незначительный недостаток, который заключается в том, что отмена свойства фактически полностью удаляет его из этого объекта, так что проверка типа $this->someProperty == null приведет к уведомлению свойства Undefined. По умолчанию значения null являются нулевыми, поэтому это будет более корректно:

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

Также возможно, что некоторым свойствам могли быть присвоены значения по умолчанию (например, protected $someArray = array();)... если вы хотите, чтобы reset все свойства возвращались к исходным значениям по умолчанию, тогда вы должны использовать отражение:

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

Это может быть чрезмерным, но может быть важно в некоторых сценариях. Обратите внимание, что это не сработает, если класс потребует аргументов конструктора; в этом случае вы можете использовать ReflectionClass:: newInstanceWithoutConstructor (введенный в PHP 5.4), затем вызовите __construct() вручную после вызова resetObject().

Ответ 3

Если у вашего класса есть метод конструктора, который инициализирует все, то вы можете просто называть это снова reset.

Ответ 4

<?php  
function reset() {
    foreach (get_class_vars(get_class($this)) as $var => $def_val){
        $this->$var= $def_val;
    }
}
?>

Ответ 5

Повторная инициализация переменной приведет к восстановлению всех членов объекта до заданных значений.

<?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);

?>

Выходы:

object(Object)#1 (4) {
  ["val1"]=>
  string(7) "string1"
  ["val2"]=>
  string(7) "string2"
  ["val3"]=>
  string(7) "string3"
  ["val4"]=>
  string(7) "string4"
}
object(Object)#2 (2) {
  ["val1"]=>
  string(4) "val1"
  ["val2"]=>
  string(4) "val2"
}

Ответ 6

Другой способ, который объединяет отмену и настройку со значением по умолчанию.

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