Autor Zpráva
rexi
Profil *
Zdravim,
mám třídu, která funguje jako model. Obsahuje metody, které se volají staticky. Výstup z těchto metod potřebuju cachovat, například do nějaké noSQL db.

Jakým způsobem mohu získat data na výstupu této metody? a dále, jakým způsobem, pokud mám výsledek cachovaný neprovádět kód metody ale rovnou vrátit uložený výsledek?
Napadá mě jedině využít metody __call pro druhou otázku, ale na první mě nic nenapadá.

Mám samozřejmě zájem udělat to automaticky, tzn abych nemusel přidávat nějaký kód do metod apod.

Děkuji za pomoc.
Nox
Profil
rexi:
mám třídu, která funguje jako model“ to je něco jako "mám třídu, která funguje jako backend"... ale tipnu si, že jde hlavně o načítání dat z databáze

Jakým způsobem mohu získat data na výstupu této metody
To záleží co ta funkce dělá.

Pokud výsledek vrací, tak si ho prostě přiřadíš.
Pokud pracuje s referencí ... tak vezmeš tu proměnnou.
Pokud něco vypisuje, použiješ ob_start(), ob_get_content() a ob_end_clean() (aspoň v docs jsem neviděl, že by get_clean měl ukončovat bufferování)
Pokud funkce přímo výsledek někam zapisuje ... tak už to začíná být problémovější a musíš si ten výsledek od tama získat - anebo (o něco lepší je) to přepsat do dvou funkci kdy jedna vrací výsledek a druhá zapíše
atd.?

jakým způsobem, pokud mám výsledek cachovaný neprovádět kód metody ale rovnou vrátit uložený výsledek
wrapper třídu a pracovat s ní ... pokud teda nechceš upravovat metody
class WrapperClassX

metoda
if( polozka_je_v_cache ) return polozka_v_cache;
else { vysledek = ClassX(...); zapis vysledek do cache; return vysledek }

__call by šlo myslim pro oboje, plus se využije call_user_func/call_user_func_array

Když je to statické, budeš muset nejspíš popřepisovat (ale může pomoct nějaké find/replace přes regulární výrazy (anebo několikrát normálně) na projekt (nebo dotyčné složky)) názvy tříd ve voláních

Být to instančně, tak se to dělá samozřejmě jednodušej

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