[ Webhosting profitux.cz ]
v6ak [ programování, bezpečnost, web, php, java, ... ] (Vít Šesták)
Buzz - v6ak Twitter - v6ak

štítky

Private class v PHP

Soukromé třídy zná snad každý, kdo programoval v Javě. A co v PHP? Tady je možné je částečne emulovat. Dále můžeme si vytvořit konvenci, prakticky kompatibilní s konvencemi Zend Frameworku, která nám je zavede.

Na začátku řeknu, že u konvencí Zend Frameworku pro pojmenovávání tříd jsem se vykašlal na velká písmena. (Ta píšu jen v některých speiálních případech - o tom ale jindy.) Takže nemám Vendor_AClass, ale vendor_aClass. Je to v mnoha ohledech kompatibilní. Snad to zde nebude vadit - tato část konvence by měla jít bez problémů převzít do konvencí Zend Frameworku.

Hlavní rozdíl mezi názvem třídy a cestou k ní je, zda je použito podtržítko, nebo lomítko. Mohou být v cestě dvě lomítka po sobě? Těžko! A dvě podtržítka v názvu třídy po sobě? Bez problému!

... a je to!

Takže mám třídu vendor_aClass. Ta chce mít soukromou třídu privateClass. Tak si ji prostě pojmenuje vendor_aClass__privateClass.

Zend Framework nemůže nadávat

Je logické, že třída s takovýmto názvem podle konvencí Zend Frameworku nemůže existovat a tudíž nebyla podle nich pojmenována. Zend to tam může klidně doplnit bez ztráty zpětné kompatibility. Snad jen dvě podtržítka nebudou znamenat něco jiného.

Jaký název souboru?

U veřejných tříd je vhodné, aby název třídy mapoval její umístění. Když budu v PHP hledat třídu vendor_aClass, vím, že ji najdu v .../vendor/aClass.php. Podobně to funguje i v Javě: package.AClass bude mít zdroják v .../package/AClass.java a bytecode podobu v  .../package/AClass.class. A vím, že se to nebude měnit.

Je to však nutné u soukromých tříd? IMHO ani ne. Soukromou třídu totiž používá předem omezená množina tříd. Takže případná změna nedělá problém - upravíme soubory se třídami, které ji používají.

Přesto mám určitý návrh, jak soukromé třídy pojmenovávat. Jsou dvě možnosti:

Jak částečně emulovat omezení soukromých tříd?

V PHP existuje funkce debug_backtrace. Tou můžete v konstruktoru a statických metodách zjistit, ze kterého souboru nebo třídy je metoda volaná. Podle toho lze odmítnout.

Pokud máte hodně statických metod, můžete si vytvořit ještě jednu soukromou pro kontrolu. Jen nezapomeňte, že nesmíte kontrolovt toho, kdo volá metodu pro kontrolu, ale musíte jít o úroveň dál.

Pochopitelně, toto není možné uplatnit u rozhraní a nelze to platnit například na dědičnost. Vytvoření potomků třídy se dá zabránit pomocí klíčového slova final, ale tato „antikoncepce“ je definitivní - třída nebude mít ani jednoho potomka. Což se ne vždy hodí.

Já osobně na takovouto ochranu kašlu. Prostě z dokumentace je jasný, že to dělat nemám, tak to prostě dělat nebudu.

Diskuzi ke článku naleznete zde.

Linkování

Líbí se Vám tato stránka? Zalinkujte ji!

Chcete sledovat novinky? Pokud si právě prohlížíte článek a hledáte RSS pro celý web, pak jste trošku jinde. Možná hledáte poslední změny.

Validní HTML 4.01 StrictValidní CSS 2.0Validní hlavní RSS kanálPHP 5Apache
referer: UA:CCBot/2.0 (http://commoncrawl.org/faq/) time:0.38191300 1498484695
web
mail
comment