2011-01-01 17 views
5

मैं एसपीएल से PHP के सामान्य रूप से उपयोग किए गए इंटरफेस के बारे में पढ़ रहा हूं, जैसे Iterator, Countable, और ArrayAccess। हालांकि, मुझे समझ में नहीं आता कि वे कैसे काम करते हैं।ArrayAccess कैसे काम करता है?

क्या उनके कार्यान्वयन PHP की मूल कार्यक्षमता को संशोधित करते हैं, उदाहरण के लिए [] सरणी ऑपरेटर ओवरलोड करना?

मैंने ऑपरेटर एक्सटेंशन के बारे में भी पढ़ा है, जो निम्न ऑपरेटरों के विस्तार के रूप में अन्य ऑपरेटरों को अधिभारित करने की क्षमता प्रदान करता है। चूंकि ऑपरेटर एक्सटेंशन स्पष्ट रूप से PHP कोर को संशोधित करता है, इसलिए मैं सोच रहा था कि ArrayAccess दृश्यों के पीछे उसी तरह कार्य करता है?

मैं एक टिंकरर हूं, जिसके परिणामस्वरूप मुझे हुड के नीचे क्या है यह जानने के बिना कुछ उपयोग करना मुश्किल लगता है।

+0

यह आपके प्रश्न का उत्तर नहीं देता है। लेकिन चूंकि आप आंतरिक के बारे में पूछ रहे हैं, तो आप यहां समाप्त हो जाएंगे: http://svn.php.net/repository/php/php-src/branches/PHP_5_3/Zend/ - ताकि आप zend_interfaces में भी देख सकें। सी और ../ext/spl/ अब। – mario

उत्तर

10

PHP और PHP एक्सटेंशन ज़ेंड इंजन के शीर्ष पर बनाए गए हैं। वे ज़ेंड इंजन कार्यक्षमता को उपयोगकर्ता-भूमि (PHP स्क्रिप्ट) पर बेनकाब करते हैं और स्वयं की विशेषताओं को जोड़ते हैं, जो या तो उपयोगकर्ता-भूमि या अन्य PHP एक्सटेंशन के संपर्क में आते हैं।

ज़ेंड इंजन ऑब्जेक्ट आयामों (ArrayAccess द्वारा उजागर कार्यक्षमता) तक पहुंचने के लिए एक ऑब्जेक्ट मॉडल प्रदान करता है और एक सामान्य पुनरावृत्ति तंत्र जिसका उपयोग ऑब्जेक्ट्स पर पुनरावृत्त करने के लिए किया जाता है (Iterator के लिए idem)। इस ऑब्जेक्ट मॉडल में कई हैंडलर होते हैं जो PHP और कोई एक्सटेंशन ऑब्जेक्ट के प्रकार (zend object handlers) के लिए प्रतिस्थापित कर सकते हैं। अपने ऑब्जेक्ट मॉडल पर, ज़ेंड इंजन एक मानक प्रकार की वस्तुओं ("ज़ेंड ऑब्जेक्ट्स") लागू करता है; प्रत्येक ऑब्जेक्ट zend_object डेटा संरचना का पालन करता है, और प्रत्येक वर्ग - जो एक अवधारणा है कि निम्न स्तर के ऑब्जेक्ट इंटरफ़ेस को इसे पुनर्प्राप्त करने के तरीके को अलग करने के अलावा नहीं पता - zend_class_entry संरचना द्वारा)।

ArrayAccess वास्तव में एक एसपीएल इंटरफ़ेस नहीं है; यह ज़ेंड इंजन में ही परिभाषित है। read_dimension/write_dimension/has_dimension ज़ेंड ऑब्जेक्ट्स के निम्न-स्तरीय हैंडलर इस तरह कार्यान्वित किए जाते हैं कि वे जांचें कि ऑब्जेक्ट ऐसे इंटरफ़ेस को लागू करता है और यदि मामला है तो संबंधित तरीकों को कॉल करें (here देखें)।

Iterator एसपीएल इंटरफ़ेस भी नहीं है; यह ज़ेंड इंजन में भी परिभाषित किया गया है। इस मामले में, इस इंटरफेस के लिए समर्थन थोड़ा उच्च स्तर पर किया जाता है। निम्न-स्तरीय ऑब्जेक्ट हैंडलर ऑब्जेक्ट पुनरावृत्ति के कुछ भी नहीं जानते; यह ज़ेंड ऑब्जेक्ट्स की एक संपत्ति है। zend_class_entry संरचना में दो प्रासंगिक सदस्य हैं: iterator_funcs फ़ील्ड और get_iterator फ़ील्ड। ये इटरेटर ऑपरेशंस और राज्य को परिभाषित करते हैं और एक नया इटरेटर कैसे बनाते हैं। विशेष रूप से Iterator के लिए, जब रनटाइम के साथ कोई श्रेणी पंजीकृत होती है, तो यह जांच की जाती है कि यह उस इंटरफ़ेस को लागू करता है, और यदि ऐसा होता है, तो उस वर्ग के zend_class_entry चर के प्रासंगिक फ़ील्ड मूल विधियों पर सेट हैं जो देशी पुनरावृत्ति इंटरफ़ेस को PHP पर पुल करते हैं तरीकों। यदि कोई एक PHP एक्सटेंशन लिखता है, तो कोई भी मूल निवासी (जो क्रमशः पुनरावृत्ति विधियों को लागू करता है) लिखने का विकल्प चुन सकता है, जैसे कि उपयोगकर्ता-भूमि में, Iterator लागू करें और PHP विधियों (इस मामले में, मूल PHP विधियों) को लागू करें इंटरफ़ेस की तरह कई संचालन का वर्णन करता है।

Countable इंटरफ़ेस एकमात्र ऐसा है जो वास्तव में एक एसपीएल इंटरफ़ेस है; ज़ेंड इंजन इसके बारे में कुछ भी नहीं जानता है। इसकी कार्यक्षमता इस तथ्य से ली गई है कि count function का कार्यान्वयन इसकी उपस्थिति के लिए जांचता है और इंटरफ़ेस मौजूद होने पर count विधि को कॉल करता है।

ऑपरेटर एक्सटेंशन अधिक निम्न-स्तर सेटिंग पर काम करता है।रनटाइम पर, सीधे ज़ेंड इंजन की याद में लिखता है और ओपकोड्स के हैंडलर को बदलता है PHP कोड संकलित करता है (ताकि अब ZEND_ASSIGN_ADD में एक नया मूल कार्यान्वयन हो, जो उपयोगकर्ता द्वारा चुने गए कुछ PHP फ़ंक्शन/विधि को रोकता है) ।

+0

वाह, धन्यवाद ** आर्टेफैक्टो ** उस व्यापक प्रतिक्रिया के लिए, यह निश्चित रूप से मेरी समझ के अंतराल में भर गया। मुझे निश्चित रूप से सीखने के लिए बहुत कुछ है। – Dan

संबंधित मुद्दे