Autor Zpráva
Charlie
Profil
Dobrý den,

zajímalo by mě, které věci je vhodné dávat do __destruct a naopak které už ne.

Dejme tomu, že mám nějaký objekt a na konci vykonávání skriptu bych chtěl jeho stav (nebo nějaké proměnné) zapsat do databáze nebo do souboru. Pokud bych pro toto chtěl použít destructor, musím si dát pozor na to, aby nevyhazoval výjimku, např takto:
public function __destruct() {
   try {
      $this->db->insert($this->state); // tady může být cokoliv
   }
   catch (Exception $e) {
      trigger_error($e);
   }
}

Intuice mi ale říká, že to není příliš čisté řešení. Pokud totiž dojde k chybě nebo k výjimce v destructoru, aplikace už nemá šanci si s tím poradit. A proto se ptám: je tento postup legitimní? Dá se nějak obejít?
Carrot
Profil *
Tak si s výjimkou poraď už v catch bloku. Vnější vrstvy, jako exception handler, už budou asi v době destrukce nedostupné.
Aichi
Profil
Nicméně se mi nezdá ani koncepčně správné mít v destruktoru ukládání stavu kamkoli. Destruktor je od toho aby se uklidila paměť, uzavřely případně neuzavřené konexe do DB, na soubory, atd.
Charlie
Profil
Děkuji za poznámky.

V tom případě jediné možné řešení je využít nějakého jednoduchého event handleru a před definitivním shutdownem zavolat definované funkce... Když se to vezme kolem a kolem, tak to není vůbec špatné řešení.
Jan Tvrdík
Profil
Charlie:
Zkus se kouknout na register_shutdown_function.
Charlie
Profil
Jan Tvrdík:
Na to jsem už před časem koukal, funkce ale skrývá podobná úskalí jako destructor. Vzhledem k tomu, že jsem to řešil pro aplikaci postavenou na Nette, využil jsem
Application::$onShutdown
, což je král všech řešení.
Majkl578
Profil
[#6] Charlie
Nebylo by lepší použít Presenter::shutdown() ? :) Přecijen aplikaci by asi mělo být jedno co se děje jinde a co se kde (ne)ukládá, ne? :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0