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
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
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
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
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
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
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
Jde, ale ne přímo v definici.
Trida::$neco = 'foo';
Pořád mi není jasný záměr s $GLOBALS a referencí, mohl by jsi zjednodušeně objasnit o co se snažíš?
xxxObiWan
Profil
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
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
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
Lamicz: Věř mi, že design mi jde hůř než PHP :-D
Majkl578
Profil
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
Nebojte, baví mě prát se s PHP, takže u toho zůstanu ;-)

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:

0