Вот мой вопрос на сегодня. Я создаю (для удовольствия) простой шаблонный движок. Основная идея заключается в том, что у меня есть тег, подобный этому {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