动态调用一个静态变量(数组)(Dynamically call a static variable

2019-06-27 09:05发布

这是我今天的问题。 我建(好玩)一个简单的模板引擎。 其基本思路是,我有一个这样的标记{博客:内容},我打破它的方法和措施。 问题是,当我想动态调用静态变量,我得到以下错误。

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

和代码:

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

$模板是我的类中的公共静态变量(阵列),并且是一个我想中检索。

Answer 1:

什么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];

将输出“气泡”



Answer 2:

您可能需要先保存为静态数组的引用。

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中添加



Answer 3:

我'不知道我在做什么,但不妨一试:

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


Answer 4:

你不能做到这一点,而不使用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 . ')');
}


Answer 5:

正如在PHP中的一切,有很多的方法对皮肤的猫一样。 我认为,最有效的方式来完成你想要的是:

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

请参阅: http://www.php.net/manual/en/function.call-user-func.php



文章来源: Dynamically call a static variable (array)