2012-07-14 15 views
6

Esempio:classe Accesso proprietà costante depressione non funziona

class LOL{ 
    const 
    FOO = 1; 
} 

$x = new LOL; 
$arr = array('x' => $x); 

echo $x::FOO; // works 
echo $arr['x']::FOO; // works too 

Ma se faccio la mia istanza di una classe di una proprietà, non posso accedere al costante più:

class WWW{ 
    protected $lol; 

    public function __construct($lol){ 
    $this->lol= $lol;  
    } 

    public function doSMth(){ 
    echo $this->lol::FOO; // fail. parse error.. wtf 
    } 
} 

$w = new WWW; 
$w->doSMth(); 

:(

So che posso fare solo echo LOL::FOO, ma cosa succede se il nome della classe è sconosciuto? Da quella posizione ho solo accesso a quell'oggetto/proprietà, e davvero non voglio che la classe WWW sia "consapevole" di le sue classi e i loro nomi. Dovrebbe funzionare solo con l'oggetto dato

+0

provare questo $ w = new WWW (nuovo LOL); ? – Gntem

+0

Ma se il nome della classe non è noto, come puoi sapere che ha 'const FOO' per cominciare? (a meno che tutte le tue classi stiano implementando un'interfaccia o estendendo qualche classe) –

+0

perché si aspetta che sia presente la costante: P – Alex

risposta

1

Se il nome della classe non è noto, è possibile utilizzare ReflectionClass per ottenere la costante. Nota che devi utilizzare PHP 5 o versioni successive.

Esempio:

$c = new ReflectionClass($this->lol); 
echo $c->getConstant('FOO'); // 1 

partire da PHP 5.3.0, è possibile accedere al costante tramite una variabile che contiene il nome della classe:

$name = get_class($this->lol); 
echo $name::FOO; // 1 

Per ulteriori informazioni, vedere Scope Resolution Operator - PHP

2

Puoi farlo molto più facilmente assegnando la proprietà lol a una variabile locale, in questo modo:

public function doSMth(){ 
    $lol = $this->lol; 
    echo $lol::FOO; 
} 

Questo è ancora sciocco, ma impedisce di dover utilizzare i riflessi.

0
$lol = &$this->lol; 
echo $lol::FOO; 
.. 
unset($lol); 
+1

Benvenuti in SO. Aggiungere una breve spiegazione è consuetudine quando aggiungi una risposta. –

Problemi correlati