这是我今天的问题。我正在构建(为了好玩)一个简单的模板引擎。基本的想法是我有一个像{blog:content}这样的标签,我在一个方法和一个动作中打破它。问题是当我想动态调用静态变量时,我得到以下错误。
Parse error: parse error, expecting `','' or `';''
代码:
$class = 'Blog';
$action = 'content';
echo $class::$template[$action];
$ template是我的类中的公共静态变量(数组),是我想要检索的那个。
答案 0 :(得分:12)
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];
输出'冒泡'
答案 1 :(得分:5)
您可能希望先保存对静态数组的引用。
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中添加了“Dynamic access to static methods is now possible”
答案 2 :(得分:0)
我不确定我在做什么,但试一试:
echo eval( $class . "::" . $template[$action] );
答案 3 :(得分:0)
如果不使用eval()
,则无法执行此操作。 $class::$template
(即使它是PHP中的有效语法),会引用名为$template
的静态变量,你实际上需要variable variables($class::$$template
),这又是无效的PHP语法(你不能从PHP,IIRC中的动态类名访问任何内容。
我建议在使用eval()
之前检查变量的有效名称,(正则表达式是从PHP manual复制的):
if (!preg_match('[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*', $class)) {
throw new Exception('Invalid class name (' . $class . ')');
}
答案 4 :(得分:0)
与PHP中的所有内容一样,有很多方法可以为同一只猫提供皮肤。我相信实现你想要的最有效的方法是:
call_user_func(array($blog,$template));
请参阅:http://www.php.net/manual/en/function.call-user-func.php