Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z klonowaniem
phpion
post 7.10.2009, 10:33:00
Post #1





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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

Ten post edytował phpion 7.10.2009, 10:37:39
Go to the top of the page
+Quote Post
darko
post 20.12.2009, 23:57:36
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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?

Ten post edytował darko 21.12.2009, 00:29:41


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.07.2025 - 09:51