动态调用静态变量(数组)

时间:2009-07-31 12:03:22

标签: php class static model methods

这是我今天的问题。我正在构建(为了好玩)一个简单的模板引擎。基本的想法是我有一个像{blog:content}这样的标签,我在一个方法和一个动作中打破它。问题是当我想动态调用静态变量时,我得到以下错误。

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

代码:

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

$ template是我的类中的公共静态变量(数组),是我想要检索的那个。

5 个答案:

答案 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