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

Php 反射-获取本地定义的变量?,php,reflection,Php,Reflection,是否也可以通过反射获得局部(非或静态)变量,如下所示 function getVars() { ... ... ...Reflection codes... ... ... } function my1() { $x = 5; ... $y = $smth_calculated; ... getVars(); } 因此,在getVars中,我能够得到$x和$y的值 编辑:我真的不知道(…但我知道),为什么这个问题有-4个否决票和

是否也可以通过反射获得局部(非或
静态
)变量,如下所示

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


function my1()
{
   $x = 5;
   ...
   $y = $smth_calculated;
   ...
   getVars();
}
因此,在
getVars
中,我能够得到
$x
$y
的值



编辑:我真的不知道(…但我知道),为什么这个问题有
-4个否决票和关闭标志…

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

首先,使用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)
}
array(3) {
  'x' =>
  string(1) "5"
  'y' =>
  string(19) "$smth_calculated" 
}
现在,还有一个解决方法来获取其他变量。我将使用一个简单的正则表达式来匹配变量,但请注意,它必须得到很大的改进

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();

我已经更新了我的问题-所以,最后,没有办法获得非静态变量对吗?更重要的是,使用已评估的
$value
?我会告诉你我为什么需要它的。好吧,恐怕没有办法做到这一点。。我从来都不需要这样的东西,但如果你愿意(只是我不想再改变你的答案,但会很好),也许通过更多的研究,你可以找到更多关于itOk的东西。如果你做了更多的修改,因为我做得更进一步,有了更好的代码,请看这里:(下面是代码的结果显示)。如果你能整合这些变化,这可能是一个更好的答案。谢谢(PHP5.6有一个小问题,您的双
??
触发错误)。