2011-01-01 13 views
5

Tôi đã đọc về các giao diện thường được sử dụng của PHP từ SPL, chẳng hạn như Iterator, CountableArrayAccess. Tuy nhiên, tôi không hiểu chính xác cách họ làm việc.ArrayAccess hoạt động như thế nào?

Việc triển khai của họ có thay đổi chức năng cốt lõi của PHP, ví dụ như quá tải toán tử mảng []?

Tôi cũng đã đọc về Tiện ích mở rộng của nhà cung cấp, cung cấp khả năng quá tải các toán tử khác trong cùng một kiểu với ngôn ngữ cấp thấp hơn. Kể từ khi phần mở rộng nhà điều hành rõ ràng sửa đổi lõi PHP, tôi đã tự hỏi nếu ArrayAccess hành vi trong cùng một cách đằng sau hậu trường?

Tôi là người phát hành tin nhắn, do đó tôi thấy khó sử dụng một cái gì đó mà không biết những gì dưới mui xe.

+0

Điều này không trả lời câu hỏi của bạn. Nhưng vì bạn đang hỏi về internals, bạn sẽ kết thúc ở đây: http://svn.php.net/repository/php/php-src/branches/PHP_5_3/Zend/ - vì vậy bạn cũng có thể có một cái nhìn vào zend_interfaces. c và ../ext/spl/ ngay bây giờ. – mario

Trả lời

10

Tiện ích mở rộng PHP và PHP được xây dựng trên cùng của Công cụ Zend. Chúng cho thấy chức năng của Zend Engine đối với người dùng (PHP script) và thêm các tính năng của riêng chúng, hoặc được tiếp xúc với người dùng hoặc các phần mở rộng PHP khác.

Công cụ Zend cung cấp mô hình đối tượng với cách truy cập thứ nguyên đối tượng (chức năng được hiển thị bởi ArrayAccess) và cơ chế lặp chung được sử dụng để lặp qua đối tượng (idem cho Iterator). Mô hình đối tượng này bao gồm một số trình xử lý mà PHP và bất kỳ phần mở rộng nào có thể thay thế cho một loại đối tượng (các zend object handlers). Trong mô hình đối tượng của nó, công cụ Zend triển khai một kiểu đối tượng tiêu chuẩn ("các đối tượng zend"); mỗi đối tượng đã theo cấu trúc dữ liệu zend_object và mỗi lớp - đó là khái niệm giao diện đối tượng cấp thấp không biết ngoài việc cung cấp cách lấy nó - theo cấu trúc zend_class_entry).

ArrayAccess thực sự không phải là giao diện SPL; nó được định nghĩa trong chính Zend Engine. Các trình xử lý cấp thấp của các đối tượng zend được thực hiện theo cách mà họ kiểm tra xem đối tượng có thực hiện giao diện đó hay không và gọi các phương thức tương ứng nếu trường hợp đó xảy ra (xem here).

Iterator cũng không phải là giao diện SPL; nó cũng được định nghĩa trong Zend Engine. Trong trường hợp này, hỗ trợ cho giao diện này được thực hiện ở mức cao hơn một chút. Trình xử lý đối tượng cấp thấp không biết gì về lặp lại đối tượng; đây là tài sản của Zend Objects. Cấu trúc zend_class_entry có hai thành viên có liên quan ở đây: trường iterator_funcs và trường get_iterator. Chúng xác định các phép toán và trạng thái của trình vòng lặp và cách tạo một trình lặp mới. Đối với Iterator đặc biệt, khi một lớp được đăng ký với thời gian chạy, nó được kiểm tra xem nó có thực hiện giao diện đó hay không, và nếu có, các trường có liên quan trong biến số zend_class_entry cho lớp đó được đặt thành các phương thức gốc để nối giao diện lặp nguyên bản với PHP phương pháp. Nếu một người viết một phần mở rộng PHP, người ta có thể lựa chọn bằng cách viết một trình lặp bản địa (thực hiện các phương thức lặp nguyên bản) hoặc, giống như trong vùng người dùng, thực hiện Iterator và viết các phương thức PHP (trong trường hợp này là các phương thức PHP nguyên gốc) cho một số thao tác, như giao diện mô tả.

Giao diện Countable là giao diện duy nhất thực sự là giao diện SPL; Zend Engine không biết gì về nó. Chức năng của nó bắt nguồn từ thực tế là việc thực hiện kiểm tra count function cho sự hiện diện của nó và gọi phương thức count nếu giao diện tồn tại.

Tiện ích mở rộng của nhà khai thác hoạt động ở cài đặt cấp thấp hơn.Khi chạy, ghi trực tiếp vào bộ nhớ của Công cụ Zend và thay thế các trình xử lý mã PHP mã opcodes thành (để bây giờ, ví dụ: ZEND_ASSIGN_ADD có triển khai thực hiện mới, điều này sẽ ngăn chặn một số hàm/phương thức PHP mà người dùng có thể chọn) .

+0

Chà, cảm ơn ** Artefacto ** cho câu trả lời toàn diện đó, nó chắc chắn lấp đầy những khoảng trống trong sự hiểu biết của tôi. Tôi chắc chắn có nhiều điều để học. – Dan