Отражение - получить локально определенные переменные? - PullRequest
0 голосов
/ 15 января 2019

Можно ли с помощью Reflection получить локальные (не global или static) переменные, как это?

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


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

Итак, в getVars я смог получить значения $x и $y.


РЕДАКТИРОВАТЬ: Я действительно понятия не имею (.. но у меня есть), почему вопрос имеет -4 downvotes & close флаги ...

1 Ответ

0 голосов
/ 15 января 2019

Ну, это сложная вещь :). Я действительно не знаю, зачем вам такая функция, но это может быть сделано с небольшим количеством работы. Конечно, это просто мое простое решение, которое можно улучшить, чтобы удовлетворить все ваши потребности.

Прежде всего, используя объект 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" 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...