Autor Zpráva
ondra256
Profil
Zdravím,

chtěl bych se zeptat na vaše názory.

Otázka zní: Lze se spolehnout na destruktor?

Příklady použití:

1) Vytáhnu si z db záznam, upravím ho z jednoho místa v kódu, poté ho upravím uplně z jiného místa v kódu, ...., a nechci posílat třeba 10 updatů na databázi. Rád bych proto využil destruktor, který by uložil do databáze změny.

2) Stahnu soubor s daty, zpracovávám a pak ho chci smazat, poté bych chtěl smazat soubor s daty

Je dobrý nápad použít destruktor na: 1) uložení změn do db, 2) smazání souboru s daty

Zajímají mně rizika, kdy se destruktor nezavolá (vyhození výjimky, vypršení časového limitu, apod.) a taky celkově vaše názory na použití destruktoru

Předem děkuju
Alphard
Profil
Vyjmenovat případy, kdy se konstruktor nezavolá, je dost složité, protože je manuál neuvádí.
Obecně lze říct, že destruktor bude zavolán ve chvíli, kdy na daný objekt již neexistují reference, nebo při ukončování scriptu v libovolném pořadí. Tady je velmi důležitá poznámka o libovolném pořadí, která prakticky znamená, že se nelze spolehnout na existenci jiných instancí (když jsem si tohle kdysi dávno přečetl v Mistrovství v PHP 5, tak jsem osobně na destruktory v PHP mírně zanevřel).

V důsledku bych řekl, že použití destruktoru je v pořádku, pokud si vystačí s nativními funkcemi PHP. Smazat soubor nebo ukončit socketové spojení bude myslím v pořádku. Uklízecích a logovacích operací bez závislostí bych se nebál.
Ukládání důležitých dat bych mu ale osobně nesvěřoval (tím spíš, že pro přístup do db používám uživatelské mezivrstvy). V destruktoru se blbě ošetřují chyby, pokud něco selže, je to problém. Vyhození exception v destruktoru vede na fatal error. Návrhově mi to také úplně šťastné nepřijde; po skončení vykonávání Modelu bych měl mít imho jistotu, že je aplikace konzistentní a tento stav reflektovat při vykreslování View, kde o tom informuji uživatele.

Další případy, kdy budou problémy, jsem našel v stackoverflow.com/a/3434279 nebo stackoverflow.com/a/2385581. Např. při vypršení časového limitu se destruktor nezavolá.
Tomáš2
Profil *
Nestrkej do destruktoru aplikační workflow a už vůbec ne práci s jinou třídou, jak zmiňuje Alphard. Pracovat s databází také není možné, je velká šance, že již spojení na db nemáš k dispozici.

Jediná věc, která se v něm dá dělat je uklizení, smazání dočasného souboru. Počítej ale s tím, že se tak občas nestane. Co vím, nezavolá se při out of memory, fatal errroru, killu aplikace atd.

Já používal destruktor na jednu jedinou věc, měřil jsem si takhle dobu běhu skriptu na serveru než to začaly dělat frameworky za mě.
ondra256
Profil
super, díky :-)

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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