【问题标题】:Dynamically call a static variable (array)动态调用静态变量(数组)
【发布时间】:2010-11-15 18:41:20
【问题描述】:

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

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

还有代码:

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

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

【问题讨论】:

    标签: php class static model methods


    【解决方案1】:

    我不确定我在做什么,但试试看:

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

    【讨论】:

    • 是的,这应该是这份工作。但我忘了提到 eval 是我最后的选择:D 。不是 eval 的粉丝。
    【解决方案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 中工作得很好。啊,“Dynamic access to static methods is now possible”是在 PHP 5.3 中添加的

    【讨论】:

    • 在 PHP 5.3 中运行良好。让我检查一下。
    • 这是给Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM
    • 很好,不知道。
    • 看来 PHP 5.3 有一些不错的新特性(比如 this 和 NAMESPACE)。
    【解决方案3】:

    如果不使用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 . ')');
    }
    

    【讨论】:

    • 你说得对,似乎 Php 正在寻找 $template 。感谢您明确说明。
    • 是的,你可以,你是对的。我会留下答案以供参考。
    【解决方案4】:

    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】:

      与 PHP 中的所有内容一样,有很多方法可以给同一只猫剥皮。我相信完成你想要的最有效的方法是:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-08
        • 1970-01-01
        • 2020-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-16
        相关资源
        最近更新 更多