Ну, это сложная вещь :). Я действительно не знаю, зачем вам такая функция, но это может быть сделано с небольшим количеством работы. Конечно, это просто мое простое решение, которое можно улучшить, чтобы удовлетворить все ваши потребности.
Прежде всего, используя объект 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"
}