2017-12-05 68 views
5

Có một khuôn khổ được gọi là Go! Aspect-Oriented Framework for PHPAOP trong PHP thuần túy không yêu cầu bất kỳ PECL nào (Go!) - Làm cách nào?

Và được tạo bằng PHP đơn giản, không yêu cầu bất kỳ PECL và DI-container nào hoạt động.

Có thể tích hợp thêm gì với bất kỳ khung và thư viện PHP hiện có nào (có hoặc không có cấu hình bổ sung).

Và không có kiểm tra thời gian chạy của các phím tắt, không có chú thích thời gian chạy phân tích cú pháp, không có evals và __call phương pháp, không có proxy chậm và call_user_func_array(). Quá trình khởi động nhanh (2-20ms) và lời khuyên.

Vì vậy, tôi rất ấn tượng, nhưng những gì tôi muốn biết, là làm thế nào để thực sự làm việc?

Những điểm mà tôi liệt kê ở đây ...

Tôi nhìn trên github và trang web chính thức, và một số điều khác, nhưng không thể tìm thấy bất cứ thông tin cụ thể về cách làm việc này (nói chung và cụ thể).

Tôi rất muốn biết cách hoạt động của tính năng này? Làm thế nào nó đã được thực hiện?

Trả lời

6

khuôn khổ này là sử dụng nhiều thủ đoạn ẩn để thực hiện công việc của mình, nhưng nếu chúng ta nhìn từ quan điểm của chim, sau đó quá trình có thể được mô tả như sau:

  1. Phiên bản hiện tại của động cơ AOP được thiết kế để làm việc chặt chẽ với nhà soạn nhạc, do đó, nó kết thúc tốt nhất bộ nạp composer với proxy riêng. Từ thời điểm đó, AOP biết về lớp nào nên được nạp và nơi tìm mã nguồn của nó.
  2. Khi một số lớp học Foo đang tải từ tệp Foo.php, AOP sẽ đưa nó vào luồng bộ lọc đặc biệt như sau: include 'php://filter/read=go.source.transforming.loader/resource=Foo.php';. Bạn có thể đọc thêm về bộ lọc luồng này tại 'php://stream' manual
  3. Tại thời điểm đó, lớp không được tải vào bộ nhớ PHP, nhưng khung đã biết về nội dung của nó và có thể thực hiện phân tích hoặc thậm chí sửa đổi mã nguồn.
  4. Source code sau đó tokenized, phân tích thành AST qua nikic/PHP-Parser thư viện và phản xạ sau đó tĩnh của mã này được tạo ra (vẫn còn mà không cần tải tập tin này vào bộ nhớ của PHP) thông qua goaop/parser-reflection
  5. kiểm tra động cơ tất cả pointcuts đăng ký từ các khía cạnh và thực hiện chuyển đổi gốc lớp Foo: được đổi tên thành Foo__AopProxied và tệp mới với lớp Foo extends Foo__AopProxied được tạo trong bộ nhớ cache.
  6. Động cơ sau đó tải trình tự động trực tiếp để tải lớp này từ tệp mới thay vì tệp ban đầu, vì vậy bạn có tên lớp ban đầu, nhưng với logic bổ sung từ lời khuyên. Nó trông giống như thế hệ trang trí tự động trong thời gian chạy.

Tất nhiên, nó chỉ là một lượng thông tin nhỏ, bởi vì thực hiện AOP trong PHP thuần là nhiệm vụ rất khó và tôi đã thử nhiều lần trước khi khám phá giải pháp làm việc. đá quý ẩn :) Một số thông tin cũng có sẵn trong số PhpSerbia talk about cross-cutting concerns in PHP của tôi, bạn có thể xem nó để hiểu rõ hơn (xin lỗi vì tiếng Anh của tôi).

Đồng thời, chúng tôi đang làm việc về tài liệu cho khuôn khổ ngay bây giờ, vì vậy nếu bạn muốn cải thiện khung công tác, chỉ cần gửi cho chúng tôi PR tới official documentation.

Bạn cũng nên sử dụng plugin PhpStorm, cung cấp nhiều tính năng cho nhà phát triển sử dụng AOP trong các dự án PHP.

Các vấn đề liên quan