👋 Nový obsah na borekb.cz

Info Tento blog je v "read-only módu" a nový obsah již nebude přibývat. O vývoji píšu na DevBlog.

Problém globální působnosti v PHP

Možná jsem exot, ale prostě mi připadá, že je úplně normální, pokud po webové platformě chci, aby mi určité věci zpřístupnila kdekoliv v rámci aplikace – tedy ve všech skriptech. Malý příklad za všechno: chtěl bych si vytvořit funkci echonl, která se bude chovat stejně jako echo s tou výjimkou, že na konec přidá znak nového řádku (\n). Jak to mám ale zařídit? Pokud bude tato funkce uložena např. v souboru commons.php někde v rootu aplikace, jednou se na tento soubor budu odkazovat pomocí include(„common­s.php“), z vnořeného adresáře pomocí include(„../com­mons.php“) apod. Problém je ten, že vždy „natvrdo“ musím vědět, kde soubor commons leží.

Dobře. Mohl by to tedy vyřešit absolutní odkaz. No jo, jenže cesta k rootu (zjistitelná např. ze superglobálního pole $_SERVER) aplikaci učiní nepřenositelnou – při změně hostingu nebo i třeba při uploadu z lokálu na hosting bude potřeba upravit všechny skripty tak, aby byla absolutní cesta k rootu v pořádku.

Nabízí se tedy udělat si vlastní funkci, která absolutní cestu zkonstruuje. Modří už vědí, že jsme zpátky na začátku začarovaného kruhu – funkce bude umístěna v nějakém souboru, ke kterému univerzálně nejsem schopen zjistit cestu.

Tento problém je podle mého názoru dost vážný, navíc nějakou funkci echonl lze ještě oželet. Zcela analogický je však problém u globální konfigurace aplikace – na tu se totiž také nelze nějak univerzálně odkázat, a to už je docela průšvih.

Existuje několik workaroundů (krásné, bohužel nepřeložitelné slovo). Ten první je autoprepend, který umožňuje do všech skriptů dané aplikace (no vlastně do všech skriptů, které zpracovává daný PHP procesor, ale to je jedno) vložit uričtý soubor. Toto řešení se mi nelíbí, protože třeba nebudu chtít onen společný soubor vkládat vždy, navíc je autoprepend záležitostí souboru php.ini, který není možné vždy editovat. Každopádně to je zcela nesystémové řešení (opět snižuje přenositelnost aplikace).

Druhá možnost je navrhnout web tak, aby odkaz byl vždy stejný (např. include(„../in­c/commons.php“)). To samozřejmě předpokládá všechny skripty v jednom adresáři, což je mi zcela proti srsti, protože mě nějaká „vlastnost“ technologie nebude omezovat v hierarchickém strukturování adresářů aplikace.

Já jsem tento problém nakonec vyřešil tak, že každý adresář má v sobě konfigurační xml soubor, který (mimo jiné) obsahuje odkaz na složku se společnými soubory. Díky novému skvělému rozšíření SimpleXML, které přichází bundlované s PHP 5, je načtení této cesty otázka dvou řádků, a aplikace zůstává poměrně dobře přenositelnou (i když si o přenositelnosti PHP aplikací myslím své poté, co jsem strávil asi týden přesunem stránek káčka z Webu zdarma na PIPNI). Zatím mi to připadá jako nejlepší řešení, nehledě na to, že lze velmi jednoduše napsat „instalační skript“, který může celou aplikaci prolézt, a pokud v nějaké složce informace o „commons adresáři“ chybí, není problém to tam doplnit.

Každopádně mě ale v tomhle PHP zklamalo. Konzultoval jsem to s lidmi na forum.builder.cz, ti samozřejmě PHP obhajovali, ale rozumnou radu jsem nedostal. Zlaté ASP.NET se svým Global.asax a Application state. No co se dá dělat, třeba časem hostingy této mnou oblíbenější technologie budou dostupnější a já budu moct dát PHP sbohem.

Zařazeno do kategorií |

Komentáře jsou uzavřeny (blog je v read-only módu). Pokud mě chcete kontaktovat, můžete mailem.