Как я могу ссылаться на массив, возвращаемый моей функцией LeaveNode, в другом файле

#php #php-parser

#php #php-парсер

Вопрос:

Я использую nikic/PHP-парсер для анализа моего PHP-кода и извлечения из него количества переменных. Я могу сделать это в одном PHP-файле.

Вот код

 lt;?php use PhpParserError; use PhpParserParserFactory; use PhpParserNodeDumper; use PhpParserNodeTraverser; use PhpParserNode; use PhpParserNodeVisitorAbstract; use PhpParserPrettyPrinter;  require __DIR__ . '/../vendor/autoload.php';  $code = lt;lt;lt;'CODE' lt;?php  $a = "test";  $b = "base64_encode";  $c = array();  $a();  array();  assert($a); CODE;  class ExtractVars extends NodeVisitorAbstract {  private $prettyPrinter = null;  private $variables = [];   public function __construct() {  $this-gt;prettyPrinter = new PhpParserPrettyPrinterStandard;  }   public function leaveNode(Node $node) {  if ( $node instanceof PhpParserNodeExprAssign ) {  $assignVars = $this-gt;extractVarRefs ( $node-gt;var );  var_dump($assignVars);  // Get string of what assigned to actually is  $assign = $this-gt;prettyPrinter-gt;prettyPrintExpr($node-gt;var);  var_dump($assign);  }  }   private function extractVarRefs ( Node $node ) : array {  $variableList = [];  // If it's a variable, store the name  if ( $node instanceof PhpParserNodeExprVariable ) {  $variable = $this-gt;prettyPrinter-gt;prettyPrintExpr($node);  $this-gt;variables[] = $variable;  $variableList[] = $variable;  }  // Look for any further variables in the node  foreach ( $node-gt;getSubNodeNames() as $newNodeName ) {  $newNode = $node-gt;$newNodeName;  if ( $newNode instanceof Node amp;amp; $newNode-gt;getSubNodeNames()) {  // Recursive call to extract variables  $toAdd = $this-gt;extractVarRefs ( $newNode );  // Add new list to current list  $variableList = array_merge($variableList, $toAdd);  }  }  return $variableList;  }   public function getVariables() : int {  return count(array_unique($this-gt;variables));  } }  $parser = (new ParserFactory)-gt;create(ParserFactory::PREFER_PHP7); $stmts = $parser-gt;parse($code); $traverser = new NodeTraverser; $varExtract = new ExtractVars(); $traverser-gt;addVisitor($varExtract); $ast = $traverser-gt;traverse($stmts); print_r($varExtract-gt;getVariables());  

Я определяю массив «$переменные» для хранения имен переменных, с которыми сталкивается LeaveNode.


Теперь, когда я не могу использовать ни одного PHP-файла. Это Visitor.php не сохраню последние несколько строк кода инициализации, мне нужно инициализировать в главном файле и получить значения в массиве. подобный этому

 //main.php $parser = (new ParserFactory)-gt;create(ParserFactory::PREFER_PHP7); $stmts = $parser-gt;parse($code); $traverser = new NodeTraverser; $traverser-gt;addVisitor($VisitorClassName); $ast = $traverser-gt;traverse($stmts);  //XXvisitor.php lt;?php use PhpParserNode; use PhpParserNodeVisitorAbstract;  class Visitor extends NodeVisitorAbstract {  public function leaveNode(Node $node)  {    } }  

Я написал только один php-файл и не занимался разработкой проекта . Как получить имена переменных, хранящиеся в моем массиве, из основного файла? В настоящее время я использую функцию afterTraverse для вывода моего массива, но я не думаю, что это правильно

 public function afterTraverse(array $nodes) {  var_dump($this-gt;variables);  }  

Нужно ли мне инициализировать свой класс в основном файле и использовать $obj-gt;массив для доступа к нему