Řeším teď otázku, jestli jde v PHP nějak rozumně zařídit dědičnost mezi statickými třídami. Rád bych dosáhl toho, abych měl sérii základních tříd, od kterých bych mohl odvozovat potomky s tím, že aplikace prostě použije posledního nadefinovaného potomka. Kdybych chtěl ty třídy instancovat, byla by to trivialita:
// Tohle se nachazi nekde v zakladni casti aplikace
class ZakladniTrida { ... }
$aktivniTrida = new ZakladniTrida();
// Tohle si napise uzivatel
class OdvozenaTrida extends ZakladniTrida { ... }
$aktivniTrida = new OdvozenaTrida();
// Kdekoliv v aplikaci pak pracuju s instanci $aktivniTrida
// a neresim, ktery konkretni potomek je pouzit.
$aktivniTrida->vykresli_zahlavi();
$aktivniTrida->vykresli_telo();
$aktivniTrida->vykresli_paticku();
Na instancích se mi nelíbí pár věcí, hlavně to, že pak musím řešit viditelnost proměnných, správné přiřazování (použít nebo nepoužít referenci) a tak nějak se mi to zdá méně bezpečné (vždycky si někdo může usmyslet, že zrovna proměnnou $aktivniTrida potřebuje pro svoje celočíselné ID pro třídu výrobků).
Pro statické třídy nelze přímo použít žádnou proměnnou, že bych měl třeba $aktivniTrida = 'ZakladniTrida'; . Nicméně jsem si našel způsob, jak tohle obejít (na vstupu mám $aktivniTrida = 'ZakladniTrida'; , z toho potom vytvořím novou třídu AktivniTrida pomocí eval("class AktivniTrida extends $aktivniTrida { } a skutečně pak můžu požívat věci jako AktivniTrida::vykresli_hlavicku(); a opravdu to funguje tak, jak by člověk od zděděného zpracování očekával.¡V tom není problém.
Spíš se teď zabývám tím, jak tenhle systém udělat co nejjednodušší pro použití. Teď na to mám funkci založenou na tom, že vím, jak se ty třídy mají jmenovat: Na vstupu dostanu string se jménem třídy, kterou potřebuju dostat, a vycházím z předpokladu, že se předdefinované třídy budou jmenovat Zakladni${jmeno} a uživatelské jen ${jmeno}, takže můžu prostě naincludovat soubory, podívat se na to, jestli existuje třída ${jmeno} a pokud ne, udělat ten eval výše. To funguje docela uspokojivě pro dva možné potomky třídy (základní a uživatelský), už ne tak pro tři (základní, modifikovaný základní [možno si představit třeba jako cachovanou variantu základní verze]) a víc. Teď přemýšlím o tom, jak to udělat pro větší počet možných potomků. Zatím mi připadá docela použitelné jít na to přes get_declared_classes() a prostě si po vložení příslušných souborů najít poslední odpovídající třídu a tu evalnout. Co byste na takové řešení řekli? |