Dynamically call a static variable (array)

后端 未结 5 1187
情深已故
情深已故 2021-01-03 07:57

Here\'s my question for today. I\'m building (for fun) a simple templating engine. The basic idea is that I have a tag like this {blog:content} and I break it in a method an

相关标签:
5条回答
  • 2021-01-03 08:05

    You cannot do that without using eval(). $class::$template (even if it was valid syntax in PHP), would reference the static variable called $template, you would actually need variable variables ($class::$$template), which is again not valid PHP syntax (you cannot access anything from a dynamic class name in PHP, IIRC).

    I would recommend checking the variables for valid names before usng eval(), though (the regex is copied from the PHP manual):

    if (!preg_match('[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*', $class)) {
        throw new Exception('Invalid class name (' . $class . ')');
    }
    
    0 讨论(0)
  • 2021-01-03 08:08

    I'am not sure what i'm doing but give it a try:

    echo eval( $class . "::" . $template[$action] );
    
    0 讨论(0)
  • 2021-01-03 08:10

    What about 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];
    

    Will output 'bubble'

    0 讨论(0)
  • 2021-01-03 08:10

    You may want to save a reference to the static array first.

    class Test
    {
        public static $foo = array('x' => 'y');
    }
    
    $class  = 'Test';
    $action = 'x';
    
    $arr = &$class::$foo;
    echo $arr[$action];
    

    Sorry for all the editing ...

    EDIT

    echo $class::$foo[$action];
    

    Seems to work just fine in PHP 5.3. Ahh, "Dynamic access to static methods is now possible" was added in PHP 5.3

    0 讨论(0)
  • 2021-01-03 08:21

    As with everything in PHP, there are a lot of ways to skin the same cat. I believe the most efficient way to accomplish what you want is:

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

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

    0 讨论(0)
提交回复
热议问题