是否也可以像这样通过反射获得 local (不是global
或static
)变量?
function getVars()
{
...
...
...Reflection codes...
...
...
}
function my1()
{
$x = 5;
...
$y = $smth_calculated;
...
getVars();
}
因此,在getVars
中,我能够获得$x
和$y
的值。
编辑:我真的不知道(..但是我知道),为什么问题有-4 downvotes & close
标志...
答案 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"
}