Autor Zpráva
phobos9007
Profil
Zdravím,

V php jsem narazil na nepříjemné omezení. Nemohu zapsat:
config::$language::$error;


Apod.

Copak vývojáře nenapadlo, že to bude někdo potřebovat? To musím asi dokola psát:
$language = config::$language;
$language::$error;


Nevíte jak tuhle minelu nahlásit komunitě? Určitě nebudu první
Lamicz
Profil
No, upřímně, nepřipadá mi to jako šťastný OOP návrh ;) Statiсké metody se používají pro nějakou inicializaci apod., např. nějaká továrnička. Když už, asi bych to řešil přes __callStatic(); (od 5.3)
phobos9007
Profil
To nejsou statické metody, ale vlastnosti :)

Nebo znáš nějaký lepší koncept než jaký používám?:

V souboru settings uživatel zadá název jazyka (třídy), settings se následně implementují do hlavní konfigurační třídy config a logicky se vytvoří globální přístupové body pro celý systém, takže např. config::$language.

A pak kdekoliv v systému chci používat config::$language::TEXTY (konstanty nebo statiky). No není to jednoduché a praktické, když dopředu nevím, jaký jazyk (třídu) uživatel zvolí? A toho mám spoustu, takže opisovat to vypadá nehezky.

Díky za rady
Alphard
Profil
phobos9007:
settings se následně implementují do hlavní konfigurační třídy config
Můžete ukázat kód, jak to máte řešené?
ShiraNai7
Profil
phobos9007:
Nebo znáš nějaký lepší koncept než jaký používám?

Snad jakýkoliv koncept je lepší než ten, o který se tu snažíš. Proč na načítání jazykových položek nemáš funkci nebo metodu, která bude vracet záznamy podle aktivního jazyka?
phobos9007
Profil
ShiraNai7:
Proč na načítání jazykových položek nemáš funkci nebo metodu, která bude vracet záznamy podle aktivního jazyka?
Proč tak složitě? Je to standardní postup, ale nechci to tak řešit. Kdyby jsi správně pochopil o co se snažím, tak mým zápisem jde všechno jednoduše bez nějakých metod, hold php to nepodporuje.

Alphard:
//File core.php
require ("sesttings.php");
$config = new config ($language, ..., ...);

//File test.php
echo config::$language::$error404
Alphard
Profil
phobos9007:
Já se snažím pochopit vaši myšlenku, ale zatím se mi to moc nedaří.
Tohle nevypadá moc jako implemtace. $config ze 3. řádku se zahodí? Proč nemůžete použít $config->error404; (když už máte vytvořenou instanci pro dané parametry)?

tak mým zápisem jde všechno jednoduše bez nějakých metod
Metody jsou poměrně důležitou součástí OOP :-) Zdá se mi, že vaše snahy zjednodušit to kód naopak komplikují.
ShiraNai7
Profil
phobos9007:
jde všechno jednoduše bez nějakých metod

K čemu děláš instanci třídy config („$config = new config ($language, ..., ...);“), když to pak voláš jen staticky? (Jestli to je kvůli voláni objektového __construct() který dělá něco statického tak to zde ani raději nepiš). Nebudu tě přesvědčovat, že tvůj výtvor nemá s OOP skoro nic společného. Chceš si prasit - pras si. Pak zde ale nechoď pro rady.

edit: a když jde tedy o více :: v jednom zápisu, tak se obrať na http://bugs.php.net/ - rád se pobavím reakcí php komunity na tvé super vylepšení
phobos9007
Profil
Alphard:
Dobře, polopatě :)
Metody samozřejmě používám, ale jen kde je to nezbytně nutné. Kde to jde to řeším staticky. Proč? Protože to můžu volat odkukoliv.
Tím odpovídám na vaši otázku:

Proč nemůžete použít $config->error404;

Protože bych tu instanci $config musel do nějaké třídy vložit jako parametr, abych s ní mohl pracovat. Když je to staticky, nic takového nemusím dělat.

A pro pana chytrého:
Jak bys to řešil jinak no? Tak mi poraď jak se tomu vyhnout. Je lehké mudrovat, ale těžší poradit
ShiraNai7
Profil
phobos9007:
Já se snažím radit. Ale radit někomu, komu připadají metody tak složité, že je nechce použivat, nemá moc cenu.
Joker
Profil
phobos9007:
Metody samozřejmě používám, ale jen kde je to nezbytně nutné. Kde to jde to řeším staticky.
To mi nedává smysl, on někdo nařídil, že statické mohou být jen atributy? Nebo jaký je problém použít statickou metodu?

Protože bych tu instanci $config musel do nějaké třídy vložit jako parametr, abych s ní mohl pracovat. Když je to staticky, nic takového nemusím dělat.
Skript v [#6] si vytvoří instanci a potom staticky přistupuje k atributům třídy.
Navíc mám dost pochybnosti, že $language je statický atribut nezávislý na instanci třídy.
Alphard
Profil
phobos9007:
Jak naznačil Joker, statické mohou být i metody. Využívá toho třeba dibi, kde můžete kdekoliv použít dibi::query() apod.
Pro sdílení určitých proměnných napříč aplikací se často vytváří určitá třída, která se o to stará. V Nette je to Environment, v Zendu Zend_Registry. Přes jejich staticky volané metody lze zpřístupnit cokoliv.
phobos9007
Profil
To jo no. Vím že existují statické metody, sám je používám jako singleton v db driverech. Znám více méně nazpaměť celý php manuál o oop, právě proto mi přišlo aktuální řešení omezené.

Když bych přepsal můj config a místo ukládání informací do vlastností je volal z metod, tak můžu klidně použít klasické:

 echo config::language ("error");


Takže si nemyslete že oop neumím. Znovu opakuji, že takhle jsem to řešil dopusud.
Pořád ale jsem toho názoru, že echo config::$language::$error je usnadnění předešlé ukázky.
Ale jak vidím, je to čistě individuální.

Mějte se
Joker
Profil
phobos9007:
Pořád ale jsem toho názoru, že echo config::$language::$error je usnadnění předešlé ukázky.
Za prvé si neumím představit, jak by to bylo implementované. To by přece musel být mega-objekt, který bude mít všechny texty v třeba tisících statických atributů.

Za druhé, opakuji: Pokud config je nastavení aplikace, nepřipadá mi, že by chybová hláška byla jeho statický člen. Jak to bude třeba pro různé jazyky?

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: