Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z klonowaniem
Forum PHP.pl > Forum > PHP > Object-oriented programming
phpion
Witam,
mam pewien problem z klonowaniem obiektów. Może od razu wkleję kod:
  1. public function execute() {
  2. if ($this->has_sheduler()) {
  3. $task = clone $this;
  4. }
  5.  
  6. $this->object->execute($this->methods, $this->progress);
  7.  
  8. $this->progress->finish();
  9.  
  10. if ($this->has_sheduler()) {
  11. $task->set_sheduler(new Task_Sheduler($this->sheduler->get_plan()));
  12.  
  13. $task_list = new Task_List();
  14. $task_list->add_task($task, TRUE);
  15. }
  16. }

Generalnie chodzi mi o to aby dodać zadanie (add_task()) będące kopią aktualnego obiektu. Poprzez $this->object->execute() wykonuję na aktualnym obiekcie pewne operacje, ale nie chciałbym aby były one uwzględnione w kopii obiektu ($task), a w aktualnej wersji kodu tak właśnie jest. Przenosząc cały kod drugiego warunku do pierwszego wszystko jest OK (bo metoda execute() się jeszcze nie wykonała). Wolałbym jednak pozostawić zapis nowego zadania w tym miejscu, ponieważ chciałbym aby w razie problemu z execute() nie tworzył się nowy wpis zadania.

Nie wiem jak to ugryźć, nie wiem co robię źle. Wewnątrz aktualnego obiektu ($this) mam inne obiekty i być może musiałbym je klonować (wymuszenie w __clone) ale nie wiem za bardzo jak to zrobić.

Jak na razie rozwiązaniem jest dodawanie zadań w transakcji w pierwszym warunku i commitowanie jej w drugim warunku, ale chciałbym zrobić to bardziej elegancko... - to rozwiązanie jest o kant dupy... po drodze mam inne zapytania, które się nie wykonają jeśli nie nastąpi commit.

Pozdrawiam,
pion
darko
Jeszcze aktualne? Nie musisz zmieniać wartości pól oryginalnego obiektu. Wystarczy wykonać jeden klon i na nim pracować. Inne metody mogą albo "obrabiać klona" albo oryginalny obiekt - do wyboru, w zależności od potrzeb (i tu umieszczasz swoją logikę), np.
  1. class Cl {
  2.  
  3. private $clone1 = null;
  4. private $x = -1;
  5.  
  6. public function execute() {
  7. echo $this->x."<br />";
  8. $this->clone1 = clone $this;
  9. $this->clone1->x = 20;
  10. echo $this->clone1->x."<br />";
  11. }
  12. public function clSetValue($v) {
  13. $this->clone1->x = $v;
  14. echo $this->clone1->x;
  15. }
  16. public function clGetValue() {
  17. return "<br />".$this->clone1->x;
  18. }
  19. public function nonclGetValue() {
  20. return "<br />".$this->x;
  21. }
  22. public function nonclSetValue($v) {
  23. $this->x = $v;
  24. }
  25.  
  26. }
  27. $cl = new Cl();
  28. $cl->execute();
  29. $cl->clSetValue(-329);
  30. echo $cl->nonclGetValue();
  31. $cl->nonclSetValue(798243);
  32. echo $cl->nonclGetValue();
  33. echo $cl->clGetValue();

// zwróci:
-1
20
-329
-1
798243
-329

Może to coś pomoże w Twojej sytuacji?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.