2009-07-31 6 views
3

Hier ist meine Frage für heute. Ich baue (zum Spaß) eine einfache Template-Engine. Die Grundidee ist, dass ich ein solches Tag {blog: content} habe und es in einer Methode und einer Aktion aufbringe. Das Problem ist, wenn ich eine statische Variable dynamisch aufrufen möchte, erhalte ich den folgenden Fehler.Dynamisch eine statische Variable (Array) aufrufen

Parse error: parse error, expecting `','' or `';'' 

Und der Code:

$class = 'Blog'; 
$action = 'content'; 
echo $class::$template[$action]; 

$ template ist eine öffentliche statische Variable (Array) in meiner Klasse, und ist das, was ich retreive wollen.

Antwort

12

Was get_class_vars?

class Blog { 
    public static $template = array('content' => 'doodle'); 
} 

Blog::$template['content'] = 'bubble'; 

$class = 'Blog'; 
$action = 'content'; 
$values = get_class_vars($class); 

echo $values['template'][$action]; 

Will Ausgang ‚Blase‘

+1

Woohoo, das funktioniert.Vielen Dank, rettete mich. – BebliucGeorge

0

Ich bin nicht sicher, was ich tue, aber es zu versuchen:

echo eval($class . "::" . $template[$action]); 
+0

Yep das sollte für den Job. Aber ich habe vergessen zu erwähnen, eval ist meine letzte Option: D .Nicht Fan von Eval. – BebliucGeorge

+0

http://stackoverflow.com/questions/951373/when-is-eval-evil-in-php – TCB13

5

Möglicherweise möchten Sie zunächst einen Verweis auf das statische Array speichern.

class Test 
{ 
    public static $foo = array('x' => 'y'); 
} 

$class = 'Test'; 
$action = 'x'; 

$arr = &$class::$foo; 
echo $arr[$action]; 

Sorry für alle die Bearbeitung ...

EDIT

echo $class::$foo[$action]; 

scheint in PHP 5.3 gut zu funktionieren. Ahh, "Dynamic access to static methods is now possible" wurde in PHP 5.3 hinzugefügt

+1

Renditen: Syntaxfehler, unerwartet T_PAAMAYIM_NEKUDOTAYIM – soulmerge

+0

Funktioniert in PHP 5.3. Lass mich das überprüfen. –

+0

Dies gibt 'Parse Fehler: Syntaxfehler, unerwartete T_PAAMAYIM_NEKUDOTAYIM' – RaYell

0

Sie können das nicht tun, ohne eval() zu verwenden. $class::$template (selbst wenn es eine gültige Syntax in PHP wäre) würde die statische Variable mit dem Namen $template referenzieren, würden Sie tatsächlich variable variables ($class::$$template) benötigen, was wiederum keine gültige PHP-Syntax ist (Sie können auf nichts von einem dynamischen Klassennamen in PHP zugreifen, IIRC).

Ich würde empfehlen, die Variablen für gültige Namen überprüfen, bevor eval() usng, obwohl (die Regex vom PHP manual kopiert):

if (!preg_match('[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*', $class)) { 
    throw new Exception('Invalid class name (' . $class . ')'); 
} 
+0

Sie haben recht, es scheint, dass PHP nach $ template sucht. Danke für die Klarheit. – BebliucGeorge

+0

Eigentlich können Sie :) –

+1

Ja, Sie können, Sie haben Recht. Ich werde die Antwort als Referenz hinterlassen. – soulmerge