Ответ 1
class Object {
function ResetObject() {
foreach ($this as $key => $value) {
unset($this->$key);
}
}
}
Смотрите: Итерация объектов
То, что я пытаюсь сделать, это использовать временный объект для хранения значений, а затем 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();
}
У кого-нибудь есть идеи?
class Object {
function ResetObject() {
foreach ($this as $key => $value) {
unset($this->$key);
}
}
}
Смотрите: Итерация объектов
Принятый ответ имеет незначительный недостаток, который заключается в том, что отмена свойства фактически полностью удаляет его из этого объекта, так что проверка типа $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()
.
Если у вашего класса есть метод конструктора, который инициализирует все, то вы можете просто называть это снова reset.
<?php
function reset() {
foreach (get_class_vars(get_class($this)) as $var => $def_val){
$this->$var= $def_val;
}
}
?>
Повторная инициализация переменной приведет к восстановлению всех членов объекта до заданных значений.
<?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"
}
Другой способ, который объединяет отмену и настройку со значением по умолчанию.
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);
}
}
}
}