代码之家  ›  专栏  ›  技术社区  ›  T.Todua Laurent W.

反射-获取局部定义的变量?

  •  -3
  • T.Todua Laurent W.  · 技术社区  · 6 年前

    有可能得到 地方的 (不是) global static )变量也有反射,像这样?

    function getVars()
    {
       ...
       ...
       ...Reflection codes...
       ...
       ...
    }
    
    
    function my1()
    {
       $x = 5;
       ...
       $y = $smth_calculated;
       ...
       getVars();
    }
    

    所以,在 getVars 我能得到 $x $y .


    编辑:我真的不知道(但我知道),为什么这个问题 -4 downvotes & close 旗帜。。。

    1 回复  |  直到 6 年前
        1
  •  1
  •   T.Todua Laurent W.    6 年前

    好吧,这是一件棘手的事情:)。我真的不知道你为什么需要这样一个函数,但是,它可以通过一点工作来完成。当然,这只是我的简单解决方案,可以改进以满足您的所有需求。

    首先,使用ReflectionFunction对象可以非常容易地访问静态变量,但不能访问内部变量。静态的可以访问,比如:

    function getVars($function)
    {
        $reflectionFunction = new ReflectionFunction($function);
    
        return $reflectionFunction->getStaticVariables();
    }
    
    function my1()
    {
       static $x = 5;
    
       $vars = getVars(__FUNCTION__);
    
       var_dump($vars);
    }
    
    my1();
    

    这个 $vars 值如下:

    array(1) {
      ["x"]=>
      &int(5)
    }
    

    现在,还有一个解决方法来获取其他变量。我将使用一个简单的正则表达式来匹配变量,但要注意它必须得到很大的改进。

    function getVars($function=null)
    {
        if(!$function) $function = debug_backtrace()[1]['function'];
        $reflectionFunction = new ReflectionFunction($function);
    
        // Open the function file.
        $file = new SplFileObject($reflectionFunction->getFileName());
        $file->seek($reflectionFunction->getStartLine() + 1);
    
        // Grab the function body.
        $content = '';
        while ($file->key() < $reflectionFunction->getEndLine() - 1) {
            $content .= $file->current();
            $file->next();
        }
    
        // Match all the variables defined.
        preg_match_all('/\$([\w]+)\s?=\s?(.*);/', $content, $matches);
    
        return array_combine($matches[1] ?? [], $matches[2] ?? []);
    }
    
    function my1()
    {
       static $x = 5;
       $y = $smth_calculated; 
    
       var_dump( getVars() );
    }
    
    my1();
    

    这个 $VARS 值如下:

    array(3) {
      'x' =>
      string(1) "5"
      'y' =>
      string(19) "$smth_calculated" 
    }