Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: __destruct()
Forum PHP.pl > Forum > PHP > Object-oriented programming
kalu111
Witam, mam pewien problem z wykonywaniem destruktora.
Oto kod:
  1. <?php
  2. class Example 
  3. {
  4.  
  5.  public function __construct(Obiekt $oObj)
  6.  { 
  7.  $this->obj = $oObj;
  8.  }
  9.  
  10. public function __destruct()
  11. {
  12.  $this->obj->action();
  13. }
  14.  
  15. } // koniec klasy Example
  16.  
  17. class Obiekt implements interfejs
  18. {
  19. public function action()
  20.  {
  21.  file_put_contents(....);
  22.  }
  23. } // koniec klasy Obiekt
  24. ?>


Destruktor wywołuje metodę action() ale ta z kolei nie chce zapisać danych do pliku.
Zadziała tylko wtedy gdy destruktor zamienimy np na close() i wywołamy ta metodę
w taki sposób
  1. <?php
  2. $o = new Example(new Obiekt());
  3. $o->close();
  4. ?>


Nie mam pojęcia o co chodzi, a zależy mi na automatyzmie, aby ta metoda wykonywała sie pod koniec wykonywania skryptu.

Co jeszcze zauważyłem, ze gdyby owtorzyl bym plik funkcja fopen() w konstruktorze klasy Obiekt
to zapis do pliku powiedzie sie przy wykorzystaniu fwrite() i bez konieczności wpisywania $o->close(), ale konstruktor w moim przypadku nie chodzi w gre.
Dlaczego nie chce działać funkcja file_put_contents?

Mógłby ktoś to wytłumaczyć ? winksmiley.jpg
Łukasz O.
  1. <?php
  2. $f=new Obiekt();
  3. $d=new Example($f);
  4. unset($d);//automatyczne wywołanie destruktora Example = wywołanie $f->action();
  5. ?>

wywołanie file_put_contents: file_put_contents('nazwa_pliku',$dane);

sprawdzone -> działa bez problemu
kalu111
Fakt faktem zadziała, ale to polega na tej samej zasadzie, ze trzeba pamiętać, aby wpisać na końcu skryptu
  1. <?php
  2. unset($zmienna)
  3. ?>
A chodzi mi o to, żeby nie wpisywać.
Tylko dlaczego nie można w destruktorze w normalnym trybie wywołać funkcji innej klasy, która chce wykonać jakąś akcję na pliku?
Łukasz O.
destruktor to destruktor - zadziała dopiero gdy zniszczysz obiekt - co w tym trudnego do zrozumienia?
Morkai
http://bugs.php.net/bug.php?id=34206

W Apache 1 i 2, wraz z wywoływaniem destruktorów zostaje zmieniony bieżący katalog roboczy (CWD).

Masz dwa wyjścia:
- http://pl2.php.net/manual/en/language.oop5.decon.php#70928
- jako pierwszy parametr file_put_contents" title="Zobacz w manualu PHP" target="_manual podaj absolutną ścieżkę do pliku

Cytat(Łukasz O. @ 26.03.2007, 13:32:08 ) *
destruktor to destruktor - zadziała dopiero gdy zniszczysz obiekt - co w tym trudnego do zrozumienia?

Nie prawda. Nie musisz sam niszczyć obiektu aby wywołać destruktor - PHP po wykonaniu skryptu zrobi to za Ciebie...
  1. <?php
  2.  
  3. class Foo { function __destruct() { print 'destructing ' . get_class( $this ); } }
  4.  
  5. $Foo = new Foo;
  6.  
  7. ?>
kalu111
Faktycznie, funkcja
  1. <?php
  2. ?>
załatwiła sprawę. Wielkie dzięki!!!!
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.