这是我今天的问题。 我建(好玩)一个简单的模板引擎。 其基本思路是,我有一个这样的标记{博客:内容},我打破它的方法和措施。 问题是,当我想动态调用静态变量,我得到以下错误。
Parse error: parse error, expecting `','' or `';''
和代码:
$class = 'Blog';
$action = 'content';
echo $class::$template[$action];
$模板是我的类中的公共静态变量(阵列),并且是一个我想中检索。
什么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的工作就好了。 啊,“ 静态方法动态访问,现在可以 ”在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