2010-10-02 7 views
13

Co próbuję zrobić, to użyć tymczasowego obiektu do przechowywania wartości, a następnie zresetować go z powrotem do pustego, bez potrzeby użycia ($ tmpObject); ?php - zresetować/wyczyścić obiekt?

Oto przykładowy kod:

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

Ktoś ma jakieś pomysły?

Odpowiedz

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

Patrz: Object iteration

+0

to rzeczywiście wadliwy, trzeba użyć 'foreach ($ to jako $ key => $ property) {rozbrojony ($ this -> $ key);}' – raveren

+0

edytowany swoją odpowiedź, dodać kilka funkcji naśladować obiekt. Możemy mieć jakąś właściwość, która jest ustawiona na '__construct' i nie chcemy jej stracić. – GusDeCooL

+0

Odzyskiwanie właściwości nie jest tym samym, co ustawienie wartości NULL. Właściwości mają domyślnie wartość null, więc lepiej byłoby ustawić je na wartość null. Aby uzyskać więcej informacji i kod, zobacz moją odpowiedź poniżej. –

3

Jeśli klasa ma konstruktora, który inicjalizuje wszystko, to może po prostu zadzwonić jeszcze raz, aby zresetować.

0

Ponowne zainicjowanie zmiennej przywróci wszystkie elementy obiektu do ich wartości domyślnych.

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

?> 

Wyjścia:

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" 
} 
+0

Chce mieć funkcję resetowania właściwości obiektu. Zwykle używa się tego modelu w MVC – GusDeCooL

13

Przyjęte rozwiązanie ma niewielką wadę, która jest że rozbrajania nieruchomość faktycznie całkowicie usuwa go z tego obiektu, tak aby sprawdzić jak $this->someProperty == null spowodowałby „Undefined właściwość "zawiadomienie. Właściwości są nieważne domyślnie, więc to byłoby bardziej poprawne:

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

Istnieje również możliwość, że niektóre właściwości mogły być podane wartości domyślne (np protected $someArray = array();) ... jeśli chcesz przywrócić wszystkie właściwości wracając do swoich pierwotnych wartości domyślnych, musisz użyć odbicia:

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

To może być przesada, ale może być ważne w niektórych sytuacjach. Zauważ, że byłoby to niemożliwe, gdyby klasa miała wymagane argumenty konstruktora; w takim przypadku można użyć ReflectionClass::newInstanceWithoutConstructor (wprowadzonego w PHP 5.4), a następnie wywołać __construct() ręcznie po wywołaniu resetObject().

+0

Myślę, że twoja metoda refleksyjna może faktycznie działać z klasami implementującymi 'IteratorAggregate' i stosującą tę metodę do pojedynczej właściwości tablicy klasy. Dla tych klas przejście przez 'foreach ($ this)' przerzuciłoby Cię przez tylko jedną właściwość. Podczas gdy wygląda na to, że odbicie przejdzie przez wszystkie właściwości. Ale co z właściwościami statycznymi klasy? –

+1

Myślę o zresetowaniu właściwości statycznych jako zupełnie innego celu niż to, co opisano w pytaniu. Jest tylko jedna kopia każdej właściwości statycznej - nie ma żadnych instancji - więc nie jestem pewien, jaka byłaby motywacja do resetowania właściwości statycznych. –

+0

Musiałem mieć mało snu, oczywiście masz rację co do właściwości statycznych. –

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

Jak to niezdefiniowane zmienne (lub ustawione na zero) nie zostały odzyskane przez 'get_class_vars (...)'? Operacja nie chce, aby zmienna była ustawiona na wartości domyślne, op chce, aby były one nieustawione? –

+0

Proponuję ci dodać trochę wyjaśnień do swoich odpowiedzi, aby inni mogli zrozumieć, co zrobiłeś lepiej. – brunocodutra

0

Innym sposobem, który łączy unset i zestaw z wartością domyślną.

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); 
      } 
     } 
    } 
} 
Powiązane problemy