Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][oop] Samoistne usuwanie obiektu w klasie
Forum PHP.pl > Forum > PHP
deirathe
Jak mam klase
  1. <?php
  2. class Session
  3. {
  4. public $vars;
  5. public function __construct()
  6. {
  7.  
  8. }
  9. public function AddNameSpace($name)
  10. {
  11. $this->vars[$name] = new Session_NameSpace();
  12. }
  13. public function __set($name,$var)
  14. {
  15. $this->vars[$name] = $var;
  16. }
  17. public function __get($name)
  18. {
  19. return $this->vars[$name];
  20. }
  21. }
  22. class Session_NameSpace
  23. {
  24. public $vars;
  25. public function __get($name)
  26. {
  27. return $this->vars[$name];
  28. }
  29. public function __set($name,$var)
  30. {
  31. $this->vars[$name] = $var;
  32. }
  33. public function AddNameSpace($name)
  34. {
  35. $this->vars[$name] = new Session_NameSpace();
  36. }
  37. public function Destroy()
  38. {
  39. unset($this);
  40. }
  41. }
  42. $s = new Session();
  43. $s->AddNameSpace("data");
  44. $s->data->AddNameSpace("aa");
  45. $s->data->aa->value = "asasa";
  46. $s->data->aa->value2 = "222222asasa";
  47. $s->data->aa->value3 = "33333asasa";
  48. print_r($s);
  49.  
  50. $s->data->Destroy();
  51. print_r($s);
  52. ?>

po wykonaniu powyższego nadal w obiekcie $s pozostaje mi obiekt typu Session_NameSpace w zmiennej data obiektu Session, istnije mozliwosc zeby klasa sama mogla zniszczyc wlasny obiekt?? Jezeli tak to jak to zrobic bo jak widac unset nie dziala a ja dostaje juz nerwow...
ayeo
Obiekt nie może zniszczyć samego siebie. Jedynie referencję co najwyżej, ale to Ci nic nie daje.
revyag
Zaglądałeś do manuala ?

http://pl.php.net/unset
Cytat
Note: It is not possible to unset $this inside an object method since PHP 5.


Zrób to z poziomu obiektu nadrzędnego.
deirathe
czyli bede mussiał to robic np:
$s->Destroy("data")questionmark.gif
Bo bardzo mi zalezy zeby moc wykonac
$s->data->Destroy();
revyag
Przecież masz napisane że się nie da smile.gif

W klasie Session robisz tak:
  1. <?php
  2. public function destroy($name) {
  3. unset($this->vars[$name]);
  4. }
  5. ?>

i później tak jak napisałeś.
deirathe
ok, dzieki wielkie, ale szkoda... buuu...
wrzasq
co prawda to nie bedzie dokladnie to czego szukasz, ale oto pewne obejscie:

  1. <?php
  2. class Session
  3. {
  4. /* ... */
  5. public function AddNameSpace($name)
  6. {
  7. $this->vars[$name] = new Session_NameSpace();
  8. $this->vars[$name]->setParent($this);
  9. }
  10. /* ... */
  11. public function DestroyChild($child)
  12. {
  13. foreach($this->vars as $name => $var)
  14. {
  15. if($var === $child)
  16. {
  17. unset($this->vars[$name]);
  18. }
  19. }
  20. }
  21. /* ... */
  22. }
  23.  
  24. class Session_NameSpace
  25. {
  26. /* ... */
  27. protected $parent;
  28. /* ... */
  29. public function setParent($parent)
  30. {
  31. $this->parent = $parent;
  32. }
  33. /* ... */
  34. public function AddNameSpace($name)
  35. {
  36. $this->vars[$name] = new Session_NameSpace();
  37. $this->vars[$name]->setParent($this);
  38. }
  39. /* ... */
  40. public function Delete()
  41. {
  42. if( isset($this->parent) )
  43. {
  44. $this->parent->DestroyChild($this);
  45. }
  46. }
  47. /* ... */
  48. public function DestroyChild($child)
  49. {
  50. foreach($this->vars as $name => $var)
  51. {
  52. if($var === $child)
  53. {
  54. unset($this->vars[$name]);
  55. }
  56. }
  57. }
  58. /* ... */
  59. }
  60. ?>


na dodatek proponuje ci, zeby klasa Session dziedziczyla po Session_NameSpace. z tego co widze sama sesja rowniez jest kontenerem dla danym w taki sam sposob jak po prostu pojedyncza grupa, ktora realizujesz przez Session_NameSpace.
deirathe
Wrzasq nasunął mi pewien pomysł ale skoro jego kod odmawiał posłuszeństwa doszedłem do czegoś takiego:
  1. <?php
  2. echo "<pre>";
  3. print_r($_REQUEST);
  4. class Session
  5. {
  6. public $vars;
  7. public function __construct()
  8. {
  9.  
  10. }
  11. public function AddNameSpace($name)
  12. {
  13. $this->vars[$name] = new Session_NameSpace();
  14. $this->vars[$name]->SetParentNode($this);
  15. $this->vars[$name]->name = $name;
  16. return $this->vars[$name];
  17. }
  18. public function __set($name,$var)
  19. {
  20. $this->vars[$name] = $var;
  21. }
  22. public function __get($name)
  23. {
  24. return $this->vars[$name];
  25. }
  26. public function DestroyChild($v)
  27. {
  28. unset($this->vars[$v]);
  29. }
  30.  
  31. }
  32. class Session_NameSpace
  33. {
  34. public $vars;
  35. public $expire;
  36. public $parent;
  37. public $name;
  38. public function __get($name)
  39. {
  40. return $this->vars[$name];
  41. }
  42. public function __set($name,$var)
  43. {
  44. $this->vars[$name] = $var;
  45. }
  46. public function AddNameSpace($name)
  47. {
  48. $this->vars[$name] = new Session_NameSpace();
  49. $this->vars[$name]->SetParentNode($this);
  50. $this->vars[$name]->name = $name;
  51. return $this->vars[$name];
  52. }
  53. public function SetParentNode($obj)
  54. {
  55. $this->parent = $obj;
  56. }
  57. public function SetExpiration($exp)
  58. {
  59. $this->expire = time()+$exp;
  60. return $this;
  61. }
  62. public function DestroyChild()
  63. {
  64. unset($this->vars[$v]);
  65. }
  66. public function Destroy()
  67. {
  68. $this->parent->DestroyChild($this->name);
  69. }
  70. }
  71. $s = new Session();
  72. $s ->AddNameSpace("data")
  73. ->setExpiration(1000);
  74. $s ->AddNameSpace("sss");
  75. $s->data->AddNameSpace("aa")
  76. ->SetExpiration(20);
  77. $s->data->aa->value = "asasa";
  78. $s->data->aa->value2 = "222222asasa";
  79. $s->data->aa->value3 = "33333asasa";
  80. print_r($s);
  81.  
  82. $s->data->Destroy();
  83. print_r($s);
  84. ?>

Z tym że jest probelem np kiedy wykonuje:
$s->data->aa->Destroy() - nie usuwa namespace drugiego rzedu, jakies pomysly??
Dzieki wszystkim za pomoc
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.