Динамически вызывать статическую переменную (массив)

Вот мой вопрос на сегодня. Я создаю (для удовольствия) простой шаблонный движок. Основная идея заключается в том, что у меня есть тег, подобный этому {blog: content}, и я разбиваю его в методе и действии. Проблема в том, что когда я хочу динамически вызвать статическую переменную, я получаю следующую ошибку.

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

И код:

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

$ template – общедоступная статическая переменная (массив) внутри моего класса и является той, которую я хочу отыскать.

Как насчет 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]; 

Выпустит «пузырь»

Вы можете сначала сохранить ссылку на статический массив.

 class Test { public static $foo = array('x' => 'y'); } $class = 'Test'; $action = 'x'; $arr = &$class::$foo; echo $arr[$action]; 

Извините за все редактирование …

РЕДАКТИРОВАТЬ

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

Кажется, это очень хорошо работает в PHP 5.3. Ahh, « Динамический доступ к статическим методам теперь возможен » был добавлен в PHP 5.3

Я не уверен, что я делаю, но попробую:

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

Вы не можете этого сделать, не используя eval() . $class::$template (даже если это был правильный синтаксис в PHP), ссылается на статическую переменную с именем $template , вам действительно понадобятся переменные переменные ( $class::$$template ), который опять недействителен синтаксисом PHP ( вы не можете получить доступ к чему-либо из динамического имени класса в PHP, IIRC).

Я бы рекомендовал проверить переменные для допустимых имен до usng eval() , хотя (регулярное выражение копируется из руководства PHP ):

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

Как и все в PHP, существует много способов обмануть одного и того же кота. Я считаю, что самый эффективный способ выполнить то, что вы хотите:

 call_user_func(array($blog,$template)); 

См .: http://www.php.net/manual/en/function.call-user-func.php