2012-03-19 26 views
15

Tôi đang muốn tạo một a PHP extension cho một dự án cá nhân. Ngoài những gì được liên kết trong bài viết trên tôi không có kiến ​​thức về zend_engine, và các kỹ năng C của tôi là 10 năm lỗi thời, và chỉ học tập. Tất cả những điều đó là để nói "Nếu có vẻ như tôi đang hỏi một câu hỏi ngớ ngẩn, tôi có lẽ là".Trả lại đối tượng PHP "Gốc" từ Tiện ích mở rộng

Có thể gọi các chức năng từ các phần mở rộng PHP khác trong phần mở rộng của riêng tôi hay mỗi phần mở rộng PHP được coi là một hòn đảo, không có thông tin chi tiết về các phần khác của hệ thống? Nếu điều này là có thể, nó là thực tế phổ biến, hoặc một Bad Idea ™?

Tức là, tôi biết tôi có thể trả về một chuỗi có nội dung như thế này.

PHP_FUNCTION(hello_world) 
{ 
    char *str; 
    str = estrdup("Hello World"); 
    RETURN_STRING(str, 0); 
} 

Tôi muốn có thể trả về, ví dụ: phần tử SimpleXML hoặc phần tử DomDocument. Googling đã được chứng minh khó khăn, vì không có một tấn ra khỏi đó về phát triển mở rộng, và có một tấn ra khỏi đó về cách sử dụng PHP tiêu chuẩn.

+0

Câu hỏi hay; Tôi sẽ ngạc nhiên nếu tài liệu của Zend không làm sáng tỏ điều này. –

+1

@KerrekSB Và đó là một RTFM tốt đẹp :). Nếu bạn (hoặc bất kỳ ai) biết về một tài liệu zend có tổng quan tốt về điều này và không cho rằng hơn 5 năm trải nghiệm hack mở rộng (hoặc thậm chí là một trong số đó) tôi rất muốn thấy nó. –

Trả lời

4

Có, tiện ích mở rộng thực tế có thể phụ thuộc vào người khác. Họ có thể:

  • Sử dụng nguồn lực mà các phần mở rộng khác đăng ký toàn cầu, chẳng hạn như các loại lớp học hoặc chức năng PHP (có nghĩa là, họ không có quyền truy cập ít hơn các kịch bản sử dụng đất, mà rõ ràng là có thể sử dụng những nguồn lực). Xem zend_call_functionzend_lookup_class_ex.
  • Sử dụng bất kỳ biểu tượng và cấu trúc đã xuất nào được khai báo trong tệp php_extensionname.h (các tiêu đề này là các tiêu đề duy nhất được coi là xuất một API gốc sang các tiện ích mở rộng khác). Tuy nhiên, một số tiện ích mở rộng thực tế có thể KHÔNG xuất một số biểu tượng được khai báo trong các tệp tiêu đề đó, bạn phải tìm kiếm các ký hiệu được khai báo với PHPAPI. Lưu ý rằng một số phần mở rộng không thể ngừng hoạt động và bạn có thể dựa vào chúng đang tồn tại (ví dụ, như 5.3/5.4, tiêu chuẩn, SPL, phản chiếu, ngày tháng, pcre, ereg).
  • Nếu cả tiện ích mở rộng và tiện ích mở rộng mục tiêu của bạn được tạo tĩnh, bạn có nhiều vĩ độ hơn trên các ký hiệu bạn có thể sử dụng, nhưng thực tế không tốt để sử dụng ký hiệu không được xuất.

Tôi muốn có thể trả về, ví dụ: phần tử SimpleXML hoặc phần tử DomDocument.

Nếu bạn cần phải nhanh chóng một cách rõ ràng SimpleXMLElement hoặc một DOMDocument, bạn có thể làm như vậy với object_init_ex. Tiện ích mở rộng thường xuất khẩu các zend_class_entry * mà phải vượt qua vĩ mô đó, nhưng nếu không bạn luôn có thể sử dụng zend_lookup_class_ex. Điều này không NOT gọi hàm khởi tạo, do đó bạn vẫn phải thực hiện thủ công nếu cần.

Một số tiện ích mở rộng có thể cung cấp giao diện gốc để khởi tạo và khởi tạo đối tượng, nhưng trong các tiện ích mở rộng chung không được chuẩn bị để các tiện ích khác khởi tạo loại của chúng.

Tất nhiên, bạn cũng có thể, giống như tập lệnh, gọi hàm PHP và phương thức trả về bất kỳ loại nào trong số các loại đó. Bạn sẽ nhận được zval * để bạn có thể trả lại từ chức năng của mình.

Để biết cách khai báo các phụ thuộc, bộ mô tả tiện ích mở rộng có số entry cho việc này. Điều này sẽ đảm bảo tiện ích mở rộng của bạn được tải sau khi tiện ích bạn khai báo phụ thuộc vào. Để khai báo sự phụ thuộc vào thời gian biên dịch, hãy xem PHP_ADD_EXTENSION_DEP.

2

Nếu bạn đang viết các phần mở rộng, thì Extending and Embedding PHP (hay còn gọi là "Sách của Sara") là đọc cần thiết. Đó là một chút ngày nay, nhưng tài nguyên tốt nhất bạn sẽ tìm thấy có sẵn trực tuyến hoặc tắt.

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