Jedenkrát inicializovaná služba jen v lokálním kontextu. rubrika: Programování: PHP

8 rmaslo
položil/-a 5.5.2015

Zadání:
Chci vytvořit ukazatel na nějakou službu, která na začátku potřebuje inicializaci. Tento ukazatel nechci zveřejňovat (nechci, aby byl Globálně přístupný). Zároveň nechci globální kontext zbytečně "zasíral" nějakými pomocnými funkcemi, classy, proměnnými atd... Je to něco podobného jako singleton, ale ten bývá většinou globálně viditelný a vrací objekt. Samozřejmě pozdní inicializace - jinak bych si to mohl dát do proměnné hned na začátku.

Dlouho jsem si myslel, že to vůbec nejde. Ale nakonec jsem vymyslel tuto konstrukci.
Klasický příklad na uložení spojení do DB.

function VykresliNeco(...)
{
$dbConn = function {
static $conn;
if ($conn===null)
  {
  $conn = Mysql_connect(....);
  }
return $conn;
};
 
if (...)
  {
  Query ($dbConn(), 'SELECT ...');
  Query ($dbConn(), 'SELECT ...');
  }
 
}

Otázka - ví někdo něco principiálního proti použití statické proměnné v anonymní funkci ?

Komentáře

  • rmaslo : static jako klíčové slovo PHP, by měl zvýrazňovač syntaxe zvýraznit :-) takhle to úplně zapadá, přitom to je zrovna to nejdůležitější ... 6.5.2015
odkaz Vyřešeno
8 Občan
odpověděl/-a 5.5.2015

Máš to v pořádku. Vidím obyčejnou kompozici funkcí a použítí memoize patternu, což je sofistikovaná věc.
Memory leak by naopak neměl hrozit, jelikož static, pokud vím, jsou jeden drátek do heapu na-rozdíl od instančních proměných.
Di není jediný pattern na konfiguraci, dle tvého zadání úlohy by se ani nehodil. Ale takový konfigurační wrapper funkce to řeší.

Tobě by se asi dobře programovalo v Lispu :)

Komentáře

  • rmaslo : Dík za slovní spojení "memoize pattern", můj problém bude, že tenhle vzor jsem neznal ... něco o tom najdu. Ad. Lisp - 1. Ano myslím si, že vše je funkce :-). 2. Rád si dávám funkce do seznamů 3. Ale myslím si, že jazyk by měl mít parser a né nutit uživatele psát derivační stromy příkazů ručně - ale naposledy jsem ho viděl někdy ještě před 1989 třeba se od té doby něco změnilo. 6.5.2015
  • rmaslo : Tady http://www.katcode.com/memoization-in-php-caching-method-results/ je ten pattern popsaný i pro PHP. Používá se to většinou na cachování časově náročných výpočtů. No získání nějakýho connectu na nějakou vzdálenou službu lze v principu taky považovat za časově náročný výpočet... Značím jako vyřešeno. 6.5.2015
  • Občan : Ten text v tom článku na to dost navazuje na historii, jak název memoize vznikl, použití může být obecnější. PHP není Haskell ani Lisp na mašinách v 80' letech, se side-efekty je povoleno pracovat. Jinak v dnešní době se orientovat ve slovních spojení je hold těžký, když i "1 + 1" se jmenuje "sum pattern" 6.5.2015

Pro zobrazení všech 5 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.