#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;массив для доступа к нему