Autor | Zpráva | ||
---|---|---|---|
scifiak Profil * |
#1 · Zasláno: 2. 3. 2010, 19:21:45
Zdravím. Mám menší problém s přístupem ze statické metody k proměnné uvnitř funkce. Pro názornost uvedu jakoby přiklad:
class mojetrida{ private $promenna = "text"; static function metoda(){ echo $this->promenna; //nefunguje toto echo $self->promenna; //ani toto } } A já se ptám, jestli to nějak vůbec jde. Není možné, abych z té metody udělal metodu nestatickou, protože jí jakoby callbackuji. Díky předem. |
||
AM_ Profil |
#2 · Zasláno: 2. 3. 2010, 19:34:41
scifiak:
„uvnitř funkce“ uvnitř jaké funkce? Ze statické metody nemůžeš přistupovat k nestatickým členům, nedává to žádný smysl: to, že máš nějakou třídu, ještě neznamená, že existuje nějaká její instance, navíc instance dané třídy nejsou ze statických metod nijak viditelné. Můžeš udělat tu proměnnou také statickou (pak je to self::$promenna). |
||
scifiak Profil * |
#3 · Zasláno: 2. 3. 2010, 19:49:47
AM:
„uvnitř jaké funkce?“ Uvnitř ... třídy. Mohl by si mi to prosím ještě jednou zopakovat tak, aby se to dalo pochopit? Mám proměnnou, uvnitř třídy, ke které potřebuju přistupovat z těla statické metody. Normálně bych na to použil klíčové slovo $this, jenže to teď nefunguje. Ta proměnná by asi neměla být pouze statická, protože, implementuju rozhraní ArrayAccess a s tou proměnnou pracují i ty metody, které jsou jakoby teď povinné (povinné proto, že je vlastně jakoby to rozhraní potřebuje.). |
||
Joker Profil |
#4 · Zasláno: 2. 3. 2010, 20:13:18
scifiak:
„Mohl by si mi to prosím ještě jednou zopakovat tak, aby se to dalo pochopit?“ Co je na tom nepochopitelného? Statická metoda může pracovat jen se statickými členy třídy. Nestatické členy se vztahují ke konkrétní instanci (nejdřív se vytvoří instance a pak se volá třeba $instance->atribut, proto tam taky je $this - "tento objekt"), statické k samotné třídě (žádná instance se nevytváří, volá se např. třída::atribut), žádný "tento objekt" neexistuje. |
||
AM_ Profil |
#5 · Zasláno: 2. 3. 2010, 20:19:02
Podívej, třída je řekněme "Pes".
Nemůžeš nad obecnou třídou "Pes" (staticky) zjišťovat délku ocasu (hodnotu proměnné konkrétní instance). Instance je třeba Alík, kterého máš doma. Ten má skutečně ocas nějaké délky, ale obecný Pes žádný konkrétně dlouhý ocas nemá. Pokud cítíš potřebu přistupovat k nestatické proměnné ze statické metody, zavání to špatným objektovým návrhem. Mimochodem, jako callbacky není problém použít běžné, nestatické metody, svázané s nějakou instancí. |
||
scifiak Profil * |
#6 · Zasláno: 2. 3. 2010, 20:56:46
Joker:
Takže když chci uvnitř statické metody volat proměnnou, kterou jsem nahoře v třídě napsal, tak mám dát jmeno_tridy::promenna["index_prommene"]? Jestli ano, tak to je nějak špatně, nejde to. |
||
Joker Profil |
#7 · Zasláno: 2. 3. 2010, 21:08:04
scifiak:
„Takže když chci uvnitř statické metody volat proměnnou, kterou jsem nahoře v třídě napsal“ Jednak to není proměnná ale atribut třídy, jednak znovu: Statická metoda nemůže pracovat s nestatickými členy třídy. Čili pokud ten atribut nebude taky statický, tak to nejde. |
||
mckay Profil |
#8 · Zasláno: 2. 3. 2010, 21:26:42
Joker:
Dobře, teď ho mám statický (static $default_values), jak se k němu teď dostanu, a hlavně, můžu k němu přistupovat i z nestatických metod? |
||
AM_ Profil |
#9 · Zasláno: 2. 3. 2010, 21:29:52
mckay:
ke statickým členům se přistupuje přes self::$promenna. Pochopitelně, že z metod můžeš přistupovat ke statickému členu, statické metody a členy jsou "něco charakteristického pro celou třídu", nikoli pro její instance. |
||
mckay Profil |
#10 · Zasláno: 2. 3. 2010, 21:38:06
AM:
Díky, to jsem potřeboval slyšet :). scifiak: Sorry, že tak příživníkuju :)) |
||
Časová prodleva: 14 let
|
0