反思-获取本地定义的变量?

时间:2019-01-15 13:19:53

标签: php reflection

是否也可以像这样通过反射获得 local (不是globalstatic)变量?

function getVars()
{
   ...
   ...
   ...Reflection codes...
   ...
   ...
}


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

因此,在getVars中,我能够获得$x$y的值。


编辑:我真的不知道(..但是我知道),为什么问题有-4 downvotes & close标志...

1 个答案:

答案 0 :(得分:1)

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

首先,使用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" 
}