นี่คือตัวแยกวิเคราะห์ 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
สามารถรักษาการจัดรูปแบบไว้สำหรับ AST ที่เปลี่ยนแปลงบางส่วนได้
โครงสร้างพื้นฐานเพื่อสำรวจและปรับเปลี่ยน AST
ความละเอียดของชื่อเนมสเปซ
การประเมินนิพจน์คงที่
ผู้สร้างเพื่อทำให้การก่อสร้าง 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 = $parser->แยกวิเคราะห์($รหัส); } catch (ข้อผิดพลาด $error) {echo "ข้อผิดพลาดในการแยกวิเคราะห์: {$error->getMessage()}n";return; }$dumper = 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 และทำการปรับเปลี่ยนบางอย่างกัน ตัวอย่างเช่น ปล่อยเนื้อหาฟังก์ชันทั้งหมด:
ใช้ PhpParserNode; ใช้ PhpParserNodeStmtFunction_; ใช้ PhpParserNodeTraverser; ใช้ PhpParserNodeVisitorAbstract;$traverser = new NodeTraverser();$traverser->addVisitor(คลาสใหม่ขยาย NodeVisitorAbstract {ฟังก์ชันสาธารณะ enterNode(Node $node) {if ($node instanceof Function_) {// ทำความสะอาดฟังก์ชั่น ร่างกาย$โหนด->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 ได้:
ใช้ PhpParserPrettyPrinter;$prettyPrinter = new PrettyPrinterStandard;echo $prettyPrinter->prettyPrintFile($ast);
นี่จะให้โค้ดต้นฉบับของเรา ลบการเรียกใช้ var_dump()
ภายในฟังก์ชัน:
<?phpfunction test($foo) - -
สำหรับคำแนะนำที่ครอบคลุมมากขึ้น โปรดดูเอกสารประกอบ
การแนะนำ
การใช้ส่วนประกอบพื้นฐาน
เอกสารส่วนประกอบ:
เดิน AST
ผู้เยี่ยมชมโหนด
การแก้ไข AST จากผู้เยี่ยมชม
การเคลื่อนที่แบบลัดวงจร
ผู้เยี่ยมชมแทรกแซง
API การค้นหาโหนดอย่างง่าย
การอ้างอิงผู้ปกครองและพี่น้อง
ความละเอียดของชื่อ
ตัวเลือกตัวแก้ไขชื่อ
บริบทการแก้ไขชื่อ
พิมพ์สวยครับ
แปลง AST กลับเป็นโค้ด PHP
การปรับแต่งการจัดรูปแบบ
การจัดรูปแบบและการรักษาการแปลงโค้ด
ผู้สร้าง AST
เครื่องมือสร้างที่คล่องแคล่วสำหรับโหนด AST
เล็กเซอร์
การจำลอง
โทเค็น ตำแหน่ง และคุณลักษณะ
การจัดการข้อผิดพลาด
ข้อมูลคอลัมน์สำหรับข้อผิดพลาด
การกู้คืนข้อผิดพลาด (การแยกวิเคราะห์รหัสที่ไม่ถูกต้องทางวากยสัมพันธ์)
การประเมินนิพจน์คงที่
การประเมินค่าคงที่/คุณสมบัติ/ตัวเริ่มต้นอื่นๆ
การจัดการข้อผิดพลาดและนิพจน์ที่ไม่รองรับ
การเป็นตัวแทน JSON
การเข้ารหัสและถอดรหัส JSON ของ AST
ผลงาน
ปิดการใช้งาน Xdebug
การนำวัตถุกลับมาใช้ใหม่
ผลกระทบจากการเก็บขยะ
คำถามที่พบบ่อย
การอ้างอิงผู้ปกครองและพี่น้อง