Autor Zpráva
scifiak
Profil *
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
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 *
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
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
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 *
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
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
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
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
AM:
Díky, to jsem potřeboval slyšet :).

scifiak:
Sorry, že tak příživníkuju :))

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: