2012-07-14 8 views
6

Beispiel:Zugriff Klasse konstant Trog Eigenschaft funktioniert nicht

class LOL{ 
    const 
    FOO = 1; 
} 

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

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

Aber wenn ich meine Klasseninstanz eine Eigenschaft machen, kann ich nicht die ständigen Zugriff auf mehr:

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(); 

:(

Ich weiß, ich kann einfach tun echo LOL::FOO, aber was ist, wenn der Klassenname unbekannt ist? Von dieser Position habe ich nur Zugriff auf dieses Objekt/Eigenschaft, und ich möchte wirklich nicht, dass WWW-Klasse von ot "bewusst" sein ihre Klassen und ihre Namen. Es sollte nur mit dem angegebenen Objekt funktionieren

+0

versuchen Sie dieses $ w = neue WWW (neues LOL); ? – Gntem

+0

Aber wenn der Klassenname nicht bekannt ist, wie können Sie wissen, dass es "const FOO" hat? (es sei denn, alle Klassen implementieren eine Schnittstelle oder erweitern eine Klasse) –

+0

, weil es erwartet, dass die Konstante vorhanden ist: P – Alex

Antwort

1

Wenn der Klassenname nicht bekannt ist, können Sie ReflectionClass verwenden, um die Konstante zu erhalten. Beachten Sie, dass Sie PHP 5 oder höher verwenden müssen.

Beispiel:

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

Ab PHP 5.3.0, können Sie die Konstante über eine Variable zugreifen kann den Klassennamen enthält:

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

Weitere Informationen finden Sie Scope Resolution Operator - PHP

2

Sie können dies viel einfacher tun, indem Sie die Eigenschaft lol einer lokalen Variablen zuweisen, wie zum Beispiel:

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

Das ist immer noch albern, aber verhindert Reflexionen zu verwenden.

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

Willkommen bei SO. Es ist üblich, eine kurze Erklärung hinzuzufügen, wenn Sie eine Antwort hinzufügen. –

Verwandte Themen