Динамически вызывать статическую переменную (массив) - PullRequest
3 голосов
/ 31 июля 2009

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

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

и код:

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

$ template - это открытая статическая переменная (массив) внутри моего класса, которую я хочу получить.

Ответы [ 5 ]

12 голосов
/ 31 июля 2009

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

Будет выводить «пузырь»

5 голосов
/ 31 июля 2009

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

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

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

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

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

EDIT

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

Кажется, что работает нормально в PHP 5.3. Ааа, " Динамический доступ к статическим методам теперь возможен " добавлен в PHP 5.3

0 голосов
/ 31 июля 2009

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

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

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

0 голосов
/ 31 июля 2009

Вы не можете сделать это без использования 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 . ')');
}
0 голосов
/ 31 июля 2009

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

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