2012-03-19 21 views
15

मैं व्यक्तिगत परियोजना के लिए a PHP extension बनाने के साथ डबलिंग कर रहा हूं। उपर्युक्त आलेख में जो जोड़ा गया है उससे परे मुझे ज़ेंड_एन्गिन का कोई ज्ञान नहीं है, और मेरे सी कौशल 10 साल पुराने हैं, और केवल अकादमिक थे। जिनमें से सभी कहना है "अगर ऐसा लगता है कि मैं एक बेवकूफ सवाल पूछ रहा हूं, तो शायद मैं हूं"।एक एक्सटेंशन से "मूल" PHP ऑब्जेक्ट्स लौटाना

क्या मेरे अपने एक्सटेंशन में अन्य PHP एक्सटेंशन से फ़ंक्शंस कॉल करना संभव है, या प्रत्येक PHP एक्सटेंशन को एक द्वीप माना जाता है, सिस्टम के अन्य हिस्सों में कोई अंतर्दृष्टि नहीं है? यदि यह संभव है, तो क्या यह सामान्य अभ्यास है, या एक बुरा विचार ™ है?

यही है, मुझे पता है कि मैं इस तरह से कुछ स्ट्रिंग वापस कर सकता हूं।

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

मैं वापस जाने के लिए, मान लें एक SimpleXML तत्व है, या एक DOMDocument तत्व सक्षम होने के लिए करना चाहते हैं। गुगलिंग मुश्किल साबित हुई है, क्योंकि विस्तार के विकास के बारे में कोई टन नहीं है, और वहां मानक PHP उपयोग के बारे में एक टन है।

+0

अच्छा सवाल; मुझे आश्चर्य होगा हालांकि अगर ज़ेंड दस्तावेज ने इस पर कोई प्रकाश नहीं डाला था। –

+1

@KerrekSB और यह एक अच्छा आरटीएफएम है :)। यदि आप (या कोई भी) एक ज़ेंड दस्तावेज़ के बारे में जानता है जिसके बारे में इसका एक अच्छा अवलोकन है और 5+ साल के विस्तार हैकिंग अनुभव (या यहां तक ​​कि कोई भी ऐसा नहीं करता) मुझे लगता है कि मुझे यह देखना अच्छा लगेगा। –

उत्तर

4

हां, एक्सटेंशन वास्तव में दूसरों पर निर्भर कर सकते हैं। वे कर सकते हैं: संसाधनों

  • उपयोग अन्य एक्सटेंशन विश्व स्तर पर रजिस्टर है कि, इस तरह के वर्ग प्रकार या PHP कार्यों के रूप में (जो है, वे उपयोगकर्ता के भूमि स्क्रिप्ट से कम उपयोग, जो स्पष्ट रूप से उन संसाधनों का उपयोग कर सकते नहीं है)। zend_call_function और zend_lookup_class_ex देखें।
  • फ़ाइल php_extensionname.h में घोषित किसी भी निर्यात किए गए प्रतीकों और संरचनाओं का उपयोग करें (ये हेडर केवल एक ही हैं जिन्हें निर्यात को अन्य एक्सटेंशन के लिए मूल एपीआई माना जाता है)। हालांकि, कुछ एक्सटेंशन वास्तव में उन शीर्षलेख फ़ाइलों में घोषित कुछ प्रतीकों को निर्यात नहीं कर सकते हैं, आपको PHPAPI के साथ घोषित प्रतीकों की तलाश करनी होगी। ध्यान दें कि कुछ एक्सटेंशन निष्क्रिय नहीं किए जा सकते हैं और आप उन पर भरोसा कर सकते हैं (उदाहरण के लिए, 5.3/5.4, मानक, एसपीएल, प्रतिबिंब, तिथि, पिक, ईरेग) के रूप में।
  • यदि आपके एक्सटेंशन और लक्ष्य एक्सटेंशन दोनों स्थिर रूप से बनाए गए हैं, तो आप निश्चित रूप से प्रतीकों पर अधिक अक्षांश का उपयोग कर सकते हैं, लेकिन गैर-निर्यातित प्रतीकों का उपयोग करने के लिए यह एक अच्छा अभ्यास नहीं है।

मैं वापस जाने के लिए, मान लें एक SimpleXML तत्व है, या एक DOMDocument तत्व सक्षम होने के लिए करना चाहते हैं।

आप स्पष्ट रूप से एक SimpleXMLElement या एक DOMDocument का दृष्टांत करने की जरूरत है, तो आप object_init_ex साथ ऐसा कर सकते हैं। एक्सटेंशन आमतौर पर zend_class_entry * निर्यात करते हैं जिन्हें उस मैक्रो को पास करना होता है, लेकिन यदि नहीं, तो आप हमेशा zend_lookup_class_ex का उपयोग कर सकते हैं। यह नहीं कन्स्ट्रक्टर को कॉल करता है, इसलिए आपको अभी भी मैन्युअल रूप से ऐसा करना होगा यदि आपको आवश्यकता हो।

कुछ एक्सटेंशन किसी ऑब्जेक्ट को तत्काल और प्रारंभ करने के लिए मूल इंटरफ़ेस प्रदान कर सकते हैं, लेकिन सामान्य एक्सटेंशन में अन्य एक्सटेंशन अपने प्रकार को तुरंत चालू करने के लिए तैयार नहीं होते हैं।

बेशक, आप एक स्क्रिप्ट की तरह, PHP फ़ंक्शन और विधियों को भी कॉल कर सकते हैं जो उन प्रकारों में से किसी एक को वापस कर देते हैं। आपको zval * मिलेगा कि आप बदले में अपने फ़ंक्शन से वापस आ सकते हैं।

निर्भरताओं को घोषित करने के तरीके के रूप में, विस्तार वर्णनकर्ता के पास entry है। यह सुनिश्चित करेगा कि आपके एक्सटेंशन को आपके द्वारा घोषित किए जाने के बाद लोड किया गया है। संकलन समय पर निर्भरता घोषित करने के लिए PHP_ADD_EXTENSION_DEP देखें।

1

मैं PHP विस्तार लेखन के बारे में ज्यादा पता नहीं है, लेकिन आप इस कोशिश कर सकते हैं, यदि आप इसे अभी तक http://devzone.zend.com/446/extension-writing-part-iii-resources/

इस का उपयोग कर नहीं पढ़ा है आप php विस्तार करने के लिए संसाधन के किसी भी प्रकार के पारित कर सकते हैं

2

यदि आप एक्सटेंशन लिख रहे हैं, तो Extending and Embedding PHP (उर्फ "सारा बुक") आवश्यक पठन है। यह अब थोड़ा सा दिनांक है, लेकिन सबसे अच्छा संसाधन आपको ऑनलाइन या ऑफ पर उपलब्ध होगा।