Autor | Zpráva | ||
---|---|---|---|
xxxObiWan Profil |
Ahoj,
potřeboval bych pochopit, proč nefunguje tenhle skript a jak to lze udělat, aby fungoval :-) Díky <? class MojeTrida{ var $nejaka_hodnota = &$GLOBALS["MojeTrida"]["nejaka_hodnota"]; Function MojeTrida(){} } // použití by pak bylo bez potřeby vytvářet instanci třídy Echo MojeTrida::$nejaka_hodnota; ?> nejdřív jsem to zkoušel narvat do konstanty, ale s tím mě PHP poslal úplně někam (nehledě na to, že slovo const podporuje až PHP5) <? class MojeTrida{ const nejaka_hodnota = &$GLOBALS["MojeTrida"]["nejaka_hodnota"]; Function MojeTrida(){} } // použití by pak bylo bez potřeby vytvářet instanci třídy Echo MojeTrida::nejaka_hodnota; ?> jde mi o to, abych mělv $GLOBALS nějakou hodnotu (která se samozřejmě může měnit), a pomocí třídy (bez vytváření instance) k ní mohl přistupovat |
||
Majkl578 Profil |
#2 · Zasláno: 4. 5. 2010, 23:58:52 · Upravil/a: Majkl578
Doporučuji přečíst si manuál pro PHP 5, zejména základy OOP.
Konstanta (jak již z jejího názvu vyplývá) má konstantní hodnotu, tudíž jí nemůžeš přiřadit hodnotu takhle. Můžeš v konstruktoru (nikoliv stejný jako název třídy, ale __construct) třídy přiřadit dynamickou hodnotu nějaké property. Použití $GLOBALS důrazně nedoporučuji. Jsi si jistý jak funguje $GLOBALS? Jsi si jistý k čemu je ampersand? Víš vlastně co jsi vůbec napsal? |
||
xxxObiWan Profil |
#3 · Zasláno: 5. 5. 2010, 00:16:32
Díky, ten __construct mi asi pomůže (z toho co jsem si teď vygooglil), zítra vyzkouším.
Jinak můžu se zeptat, proč nedoporučuješ použití $GLOBALS v tomhle případě? Nějaká krátká ukázka, odkaz na ni nebo tak ;-) Díky |
||
Majkl578 Profil |
#4 · Zasláno: 5. 5. 2010, 00:25:29
Princip takového navrhu, který jsi uvedl je snad proti všem zásadám. Konstanta může obsahovat pouze neměnnou skalární hodnotu (číslo, řetězec apod.).
Tvůj záměr použití $GLOBALS moc nechápu, ale domnívám se, že by to řešila statická proměnná třídy. Osobně jsem nikdy $GLOBALS nepoužil a nenašel žádný smysluplný význam (vše jde řešit lépe - čistěji, přehledněji). Pokud máš na serveru PHP4, doporučuji změnit hosting. class Foo { public static $bar; function set($value) { self::$bar = $value; } } $foo = new Foo(); $foo->set('x'); var_dump(Foo::$bar); $foo->set('y'); var_dump(Foo::$bar); $foo->set('z'); var_dump(Foo::$bar); |
||
xxxObiWan Profil |
tak jsem to zkusil hned, a zjistil jsem že můj problém je ještě někde jinde :-) viz ukázka:
Toto funguje: <?php class Trida{ const neco = "ahoj"; } Echo Trida::neco; ?> A toto nefunguje, i když logicky by podle mě mělo: <?php class Trida{ var $neco = "ahoj"; } Echo Trida::$neco; ?> Prosím neptejte semě k čemu to potřebuju (je to složité), ale zkouším teď co všechno jde dělat s třídami bez toho, aniž bych musel vytvářet jejich instance :-) Moderátor Majkl578: Vkládej prosím kódy mezi značky [>pre] a [>/pre] (stačí kliknout na ).
|
||
Majkl578 Profil |
#6 · Zasláno: 5. 5. 2010, 00:40:59
Pokud je property volána staticky, musí mít v definici klíčové slovo static.
Dále se určuje viditelnost proměnných pomocí public/protected/private, nikoliv pomocí var. Se statickými třídami se toho nedá dělat tolik jako s instancemi. Od PHP 5.3 je dostupné Late Static Binding a __callStatic(). S PHP 5.3 přichází také podpora jmenných prostorů, jejichž simulací často bývaly právě statické třídy sjednocující funkce, které měly společný význam (například práci s řetězci). O PHP <5 se nemá smysl bavit, tam je podpora objektového programování mizivá. |
||
vrtakcz Profil |
#7 · Zasláno: 5. 5. 2010, 01:13:28 · Upravil/a: vrtakcz
jen "doplním" co psal Majkl578 (i když se to dá dočíst v hodně příručkách)
v PHP4 se skutečně používalo: <?php class Trida{ var $neco = "ahoj"; } Echo Trida::$neco; ?> Ale v PHP5 je to trochu jinak var se nepoužívá místo toho tu je už zmíněná viditelnost (public/protected/private) dále PHP4 nemělo statické vlastnosti což je novinka PHP5 která se funguje tak že se přidá static za definici viditelnosti vlastnosti (jak je videt na Majkl578 ukázce). @Majkl578: myslíš si že někdo kdo neví co dělá ampersand bude vědět co to ampersand je? (nápověda: &) |
||
xxxObiWan Profil |
#8 · Zasláno: 5. 5. 2010, 09:31:48
Ok, a teď pro mě nejdůležitější dotaz :-) Jde nějak ke statické proměnné přiřadit referenci?
<?php class Trida { public static $neco = &$GLOBALS["neco"]; } ?> PHP (verze 5.2.6) mi hází Parse error: syntax error, unexpected '&' in /...blabla.../code.php on line 3 |
||
Majkl578 Profil |
#9 · Zasláno: 5. 5. 2010, 09:49:02
Jde, ale ne přímo v definici.
Trida::$neco = 'foo'; |
||
xxxObiWan Profil |
#10 · Zasláno: 5. 5. 2010, 10:16:19
Tyjo, tohle je asi to co jsem potřeboval :-)
Ok, snad to nevyzní hloupě, neumím moc vysvětlovat co se mi zrovna honí v hlavě :-) Dělám redakční systém. Většinou používám, např. ke konfiguraci, právě $GLOBALS, aby tyto hodnoty byly dostupné všude: $GLOBALS["config"]["sablona_vzhledu"] = "muj_vzhled"; $GLOBALS["config"]["hezke_adresy"] = True; $GLOBALS["config"]["db_prefix"] = "rs_"; //takto zadávám hodnoty v konfiguračním souboru Bylo by ale hezčí, kdybych k těmto hodnotám mohl v kódu přistupovat třeba přes Web::conf["db_prefix"] //je to kratší, hezčí, a díky statické třídě taky dostupné odkudkoliv - globální Web::$conf["db_prefix"] //asi se ale budu muset spokojit s tímhle, i když taky dobrý :-) No a samozřejmě bych pro to našel plno dalších využití, prakticky k celému jádru systému bych mohl přistupovat přes "Web::něco" a zároveň bych k tomu měl přístup i uvnitř všech funkcí a metod objektů. Web::$Template->prirad("clanek.nadpis", $nejaka_hodnota); //objekt do Web::Template asi taky nenatlačím, že? I když by to bylo hezčí bez toho dolaru :-) Nechtěl jsem vytvářet instanci $Web = new Web();, protože objekt $Web by nebyl globální, v každé funkci a metodě ostatních tříd bych musel použít global $Web;, navíc zápis s dvojtečkama se mi líbí víc (jen z estetického hlediska :-) ) Určitě mi řeknete, že to není dobrý nápad, no nechám si rád poradit, jsem otevřený novým nápadům ;-) Díky |
||
AM_ Profil |
#11 · Zasláno: 5. 5. 2010, 10:31:35
xxxObiWan:
„každé funkci a metodě ostatních tříd bych musel použít global $Web“ Ne nemusel. Pokud nějaká metoda ke své práci požaduje instanci třídy web, předáš ji jako parametr, na "global" raději úplně zapomeň. „Dělám redakční systém. Většinou používám, např. ke konfiguraci, právě $GLOBALS, aby tyto hodnoty byly dostupné všude:“ To není zrovna šťastné. Když už se tak pouštíš do statických tříd, udělej si jako statickou třídu Config, která bude také viditelná všude a bude to v souladu s OOP. |
||
Lamicz Profil |
#12 · Zasláno: 5. 5. 2010, 18:25:39
navíc zápis s dvojtečkama se mi líbí víc (jen z estetického hlediska :-)
V tom pripade Ti asi doporucim, aby ses radeji venoval designu :) To neni estetika, ale syntaxe, kterou se resi urcite vztahy v OOP a kazdy pripad je vhodny na neco jineho. Ne, ze je neco "hezci"... |
||
xxxObiWan Profil |
#13 · Zasláno: 5. 5. 2010, 20:14:18
Lamicz: Věř mi, že design mi jde hůř než PHP :-D
|
||
Majkl578 Profil |
#14 · Zasláno: 5. 5. 2010, 20:17:07
xxxObiWan:
Tak to potom zkus práci v kanceláři, třeba s Wordem. Pokud ani to nepůjde, manuální práce taky existují (horník, stavař,...). |
||
xxxObiWan Profil |
#15 · Zasláno: 5. 5. 2010, 20:20:26
Nebojte, baví mě prát se s PHP, takže u toho zůstanu ;-)
|
||
Časová prodleva: 14 let
|
0