هذا محلل PHP مكتوب بلغة PHP. والغرض منه هو تبسيط تحليل التعليمات البرمجية الثابتة ومعالجتها.
وثائق الإصدار 5.x (الحالي؛ للتشغيل على PHP >= 7.4؛ لتحليل PHP 7.0 إلى PHP 8.4، مع دعم محدود لتحليل PHP 5.x).
وثائق الإصدار 4.x (مدعم؛ للتشغيل على PHP >= 7.0؛ لتحليل PHP 5.2 إلى PHP 8.3).
ومن أهم الميزات التي توفرها هذه المكتبة:
تحليل كود PHP 7 و PHP 8 إلى شجرة بناء جملة مجردة (AST).
يمكن تحليل التعليمات البرمجية غير الصالحة إلى AST جزئي.
يحتوي AST على معلومات دقيقة عن الموقع.
إلقاء AST في شكل يمكن قراءته بواسطة الإنسان.
تحويل AST مرة أخرى إلى كود PHP.
يمكن الحفاظ على التنسيق لـ ASTs التي تم تغييرها جزئيًا.
البنية التحتية لاجتياز وتعديل ASTs.
حل أسماء مساحات الأسماء.
تقييم التعبيرات الثابتة.
يقوم المنشئون بتبسيط إنشاء AST لإنشاء التعليمات البرمجية.
تحويل AST إلى JSON والعودة.
تثبيت المكتبة باستخدام الملحن:
php composer.phar require nikic/php-parser
قم بتحليل بعض أكواد PHP إلى AST وقم بتفريغ النتيجة في شكل يمكن قراءته بواسطة الإنسان:
<?phpuse PhpParserError;use PhpParserNodeDumper;use PhpParserParserFactory;$code = <<<'CODE'<?phpfunction test($foo){ var_dump($foo);}CODE;$parser = (new ParserFactory())->createForNewestSupportedVersion (); حاول {$ast = $المحلل->تحليل($code); } Catch (خطأ $error) {echo "خطأ في التحليل: {$error->getMessage()}n";return; }$dumper = new NodeDumper;echo $dumper->dump($ast) . "ن"؛
يؤدي هذا إلى تفريغ AST الذي يبدو مثل هذا:
array( 0: Stmt_Function( attrGroups: array( ) byRef: false name: Identifier( name: test ) params: array( 0: Param( attrGroups: array( ) flags: 0 type: null byRef: false variadic: false var: Expr_Variable( name: foo ) default: null ) ) returnType: null stmts: array( 0: Stmt_Expression( expr: Expr_FuncCall( name: Name( name: var_dump ) args: array( 0: Arg( name: null value: Expr_Variable( name: foo ) byRef: false unpack: false ) ) ) ) ) ) )
دعونا نجتاز AST ونجري نوعًا من التعديل. على سبيل المثال، قم بإسقاط كافة الهيئات الوظيفية:
use PhpParserNode;use PhpParserNodeStmtFunction_;use PhpParserNodeTraverser;use PhpParserNodeVisitorAbstract;$traverser = new NodeTraverser();$traverser->addVisitor(new class Extends NodeVisitorAbstract {public function enterNode(Node $node) {if ($node exampleof Function_) {// تنظيف الدالة body$node->stmts = []; } } });$ast = $traverser->traverse($ast);echo $dumper->dump($ast) . "ن"؛
وهذا يعطينا AST حيث Function_::$stmts
فارغة:
array( 0: Stmt_Function( attrGroups: array( ) byRef: false name: Identifier( name: test ) params: array( 0: Param( attrGroups: array( ) type: null byRef: false variadic: false var: Expr_Variable( name: foo ) default: null ) ) returnType: null stmts: array( ) ) )
أخيرًا، يمكننا تحويل AST الجديد مرة أخرى إلى كود PHP:
use PhpParserPrettyPrinter;$prettyPrinter = new PrettyPrinterStandard;echo $prettyPrinter->prettyPrintFile($ast);
وهذا يعطينا الكود الأصلي، مطروحًا منه استدعاء var_dump()
داخل الدالة:
<?phpfunction test($foo) { }
للحصول على مقدمة أكثر شمولاً، راجع الوثائق.
مقدمة
استخدام المكونات الأساسية
وثائق المكون:
المشي AST
زوار العقدة
تعديل AST من الزائر
اجتياز ماس كهربائى
الزوار المتداخلين
عقدة بسيطة للعثور على API
مراجع الوالدين والأخوة
قرار الاسم
خيارات محلل الاسم
سياق تحليل الاسم
طباعة جميلة
تحويل AST مرة أخرى إلى كود PHP
تخصيص التنسيق
تنسيق الحفاظ على تحويلات التعليمات البرمجية
بناة AST
بناة يجيدون عقد AST
ليكسر
مضاهاة
الرموز والمناصب والصفات
معالجة الأخطاء
معلومات العمود عن الأخطاء
استرداد الأخطاء (تحليل التعليمات البرمجية غير الصحيحة من الناحية النحوية)
تقييم التعبير المستمر
تقييم المُهيئات الثابتة/الخاصية/إلخ
معالجة الأخطاء والتعبيرات غير المدعومة
تمثيل جيسون
تشفير وفك تشفير JSON لـ ASTs
أداء
تعطيل برنامج Xdebug
إعادة استخدام الأشياء
تأثير جمع القمامة
الأسئلة المتداولة
مراجع الوالدين والأشقاء