Phpstan/phpdoc-trình phân tích cú pháp
Hôm nay chúng ta xem xét cách sửa đổi docblocks một cách dễ dàng. Nhưng trước tiên, chúng ta phải tìm hiểu cách thức hoạt động của 0 Show
Hãy bắt đầu với một docblock đơn giản như thế này
Nếu chúng ta phân tích cú pháp bằng 1. bạn biết gì?
Nếu chúng ta kết xuất 2, chúng ta sẽ có được cây nút đại khái như sau
Đây là PHP cổ điển - đối tượng trong một đối tượng trong một đối tượng Làm thế nào chúng ta có thể Thay thế composer require symplify/astral9 bằng use Symplify\Astral\PhpDocParser\StaticFactory\SimplePhpDocParserStaticFactory; $values = <<<'PHPDOC' /** * @return int */ PHPDOC; $simplePhpDocParser = SimplePhpDocParserStaticFactory::create(); $phpDocNode = $simplePhpDocParser->parse($values);4?Đầu tiên, chúng ta cần đến 5. Sau đó, chúng tôi kiểm tra giá trị của nó là 6. Nếu vậy, chúng tôi đổi nó thành 7. Có vẻ khá đơn giản, phải không?
Nếu chúng tôi chạy mã ở trên, chúng tôi quản lý để thấy sự thay đổi này
Cấp độ tiếp theo. 2 nútTrong cuộc sống thực, loại này hiếm khi được sử dụng ở một vị trí. Hãy thêm 8
Sau khi phân tích cú pháp, chúng tôi nhận được cây nút này
Làm thế nào chúng ta nên mở rộng logic ở trên để bao gồm cả thẻ 8?
Dễ dàng chọn, phải không? Cấp độ tiếp theo. 2 nút với các loại lồng nhauCác loại cũng có thể là hợp chất, đây là 0 với 2 nút 5 trong đó
Bây giờ chúng ta đang bước vào vòng lặp của niềm vui. Tôi đoán bạn có thể tưởng tượng làm thế nào điều này có thể trở thành mã hóa địa ngục Nhưng tại sao chúng ta lại muốn thay đổi 9 thành 4? Trong thực tế, chúng tôi muốn đổi tên lớp cũ thành một lớp mới 0Quá nhiều sự phức tạpCó lẽ bạn đang thắc mắc tại sao việc thay đổi một nút trong docblock lại khó đến vậy? Trên thực tế, có ~40 lớp kế thừa từ 4. Chúng ta sẽ phải thêm một dấu kiểm cho từng cái một, nếu nó có một kiểu, được lồng vào một thuộc tính nào đó, v.v.Còn Node Traverser thì sao?Thay vào đó, chúng ta có thể sử dụng nguyên tắc tương tự như trình phân tích cú pháp php - trình duyệt nút với khách truy cập nút Bạn có nghe về nó lần đầu tiên không?
Mã thực sựTrong thực tế, chúng ta nên chạy ngang trên 9 để có được kết quả 1Ồ, chúng tôi quên thêm 7 2Bây giờ chúng tôi chỉ thêm 1 vào 2 ↓ 3Đó là nó. Giờ đây, mọi "int" đơn lẻ đều được chuyển thành "chuỗi", ngay cả trong các doblock phức tạp như thế này 4Làm thế nào nó hoạt động?Logic rất đơn giản - một lần nữa, công lao thuộc về Nikita Popov, người đã tạo NodeTraverser trong trình phân tích cú pháp php 2 đi qua mọi thuộc tính công khai của nút đó (xem trên Github)Điều đó có nghĩa là nếu 4 đi vào, nó sẽ đi qua đó 5Nếu 5 là nút, nó sẽ đi qua tất cả các thuộc tính công khai của nó, v.v.Công khai các thuộc tính là một quy ước trong cả trình phân tích cú pháp phpdoc và trình phân tích cú pháp php, vì vậy chúng tôi có thể tin tưởng 100% vào nó |