Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zniszczenie obiektu - samobojstwo :)
Forum PHP.pl > Forum > PHP > Object-oriented programming
predom
Mam pytanie czy obiekt może zniszczyć sam siebie
przykład:
  1. <?php
  2. class czlowiek
  3. {
  4.  function usun_z_bazy()
  5.  {
  6. echo 'usuwam z bazy';
  7. unset($this);
  8.  }
  9.  
  10.  function sprawdz()
  11.  {
  12. echo 'sprawdz';
  13.  
  14.  }
  15.  function __destruct()
  16.  {
  17. echo 'zniszczony';
  18.  
  19.  }
  20.  
  21. }
  22.  
  23. $ja = new czlowiek();
  24. $ja->usun_z_bazy();
  25. $ja->sprawdz();
  26. ?>


Po wywołaniu usun_z_bazy() obiekt ma być zniszczony, jak to zrobić, czy w ogole się da?
Kicok
Nie da się. Nie można usuwać obiektu z jego wnętrza. Użyj do tego destruktora:

  1. <?php
  2.  
  3. class czlowiek
  4. {
  5. private function usun_z_bazy()
  6. {
  7. echo 'usuwam z bazy<br>';
  8. }
  9.  
  10. public function __destruct()
  11. {
  12. $this->usun_z_bazy();
  13. echo 'zniszczony<br>';
  14. }
  15.  
  16. public function sprawdz()
  17. {
  18. echo 'sprawdz<br>';
  19. }
  20. }
  21.  
  22.  
  23. $ja = new czlowiek;
  24. $ja->sprawdz();
  25. unset( $ja );
  26.  
  27. ?>
predom
ok, dzieki, chodziło mi tylko o to czy na pewno obiekt nie może zniszczyć się sam z wnętrza.

ps. nie o taki kod chodzilo smile.gif obiekt nie ma sie usuwac z bazy w przypadku zniszczenia, tylko niszczyc sam w przypadku usuniecia z bazy
tiraeth
  1. <?php
  2. class Foo {
  3. public function __construct(){
  4. // Add Foo to database
  5. return true;
  6. }
  7. public function remove_from_db(){
  8. // Remove Foo from database;
  9. return true;
  10. }
  11. public function is_removed(){
  12. // Check for Foo in database
  13. return true;
  14. }
  15. public function __destruct(){
  16. // Do nothing
  17. return true;
  18. }
  19. }
  20.  
  21. $oFoo = new Foo();
  22. $oFoo->remove_from_db();
  23. if ( $oFoo->is_removed() ) {
  24. unset($oFoo);
  25. }
  26. ?>


questionmark.gif Bo za bardzo nie rozumiem, o co Ci chodzi... Jeśli chcesz usunąć obiekt po usunięciu wpisu z bazy danych, to dajesz unset na obiekcie po wywaleniu wpisu z db.
delfinium
Z tego co mi wiadomo samozagłada nie jest możliwa. Możesz natomiast "zniszczyć" dostęp do obiektu lub przynajmniej zwolnić trochę pamięci w ten sposób:

  1. <?php
  2. class Foo
  3. {
  4. public function doSomethingAndDie( &$object )
  5. {
  6. // doSomething
  7. $object = null;
  8. }
  9. }
  10.  
  11. $foo = new Foo();
  12.  
  13. $foo->doSomethingAndDie( $foo );
  14. ?>


Kod $foo->doSomethingAndDie( $foo ) wygląda głupio ale do $this nic się nie da przypisać a potrzebna referencja do obiektu.
Wynik: $foo ciągle istnieje ale jest null a zaraz po $object = null wywoływany jest destruktor klasy.
Nie jest to dokładnie samodestrukcja obiektu ale temat wydał mi się ciekawy i musiałem sprawdzić.
Sedziwoj
Proponuję rzucić na to jak jest robione w Propel...
Samo unset() może nic nie dać jeśli do obiektu jest referencja z innej zmiennej, więc obiekt musi sam się pilnować czy był usunięty, a jak tak to nie pozwalać wykonać pewnych operacji na sobie. (Pomijam fakt, że jak takie operacie były by, to świadczy o tym że ktoś nie umie poprawnie programować)
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.