| 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: 16 let
|
|||
0
).