2008-09-28 12 views
6

क्या एक कक्षा लिखना संभव होगा जो सभी आवश्यक एसपीएल इंटरफेस को लागू करके वास्तविक PHP सरणी से लगभग अलग नहीं है? क्या वे कुछ भी याद कर रहे हैं जो महत्वपूर्ण होगा?PHP का एसपीएल: क्या एरे से जुड़े इंटरफेस में सभी सरणी गुण शामिल हैं?

मैं एक और अधिक उन्नत ऐरे ऑब्जेक्ट बनाना चाहता हूं, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि मैं एक मौजूदा ऐप नहीं तोड़ूंगा जो हर जगह सरणी का उपयोग करता है यदि मैंने उन्हें कस्टम ऐरे क्लास के साथ प्रतिस्थापित किया है।

उत्तर

7

एकमात्र समस्या जो मैं सोच सकता हूं वह gettype() और is_array() फ़ंक्शंस हैं। क्योंकि यद्यपि आप सिर्फ एक सरणी की तरह वस्तु का उपयोग कर सकते, यह अभी भी एक वस्तु के रूप में पहचाना जाएगा के लिए

gettype($FakeArray) == 'array' 
is_array($FakeArray) 

अपने कोड की जाँच करें।

+2

फिर भी, यह है कि मैं अतिरिक्त मामलों के लिए खाते की उन कार्यों को ओवरराइड करने के override_function() फंक्शन इस्तेमाल कर सकते हैं लग रहा है। – Wilco

3

अन्य मतभेदों में सरणी (विलय) के लिए '+' ऑपरेटर और पूरे array_* फ़ंक्शंस की विफलता शामिल है, जिसमें आमतौर पर array_merge और array_shift शामिल हैं।

4

ऊपर दिए गए अंकों के अतिरिक्त, आप उपयोगकर्ता-स्पेस सरणी प्रकार संकेतों को अपनी कक्षा के उदाहरणों के साथ काम करने में सक्षम नहीं होंगे। उदाहरण के लिए:

<?php 
function f(array $a) { /*...*/ } 

$ao = new ArrayObject(); 
f($ao); //error 
?> 

आउटपुट:

Catchable fatal error: Argument 1 passed to f() must be an array, object given