2009-10-16 13 views
16

मैं PHP5 सीख रहा हूं (पिछली बार मैंने PHP की जांच PHP4 दिनों में की थी) और मुझे यह देखकर खुशी हो रही है कि PHP5 ओओ PHP4 की तुलना में अधिक जावा-समान है लेकिन अभी भी एक समस्या है मुझे मेरी जावा पृष्ठभूमि की वजह से काफी असहज महसूस होता है: ARRAYS।PHP में जावा-जैसे संग्रह

मैं "प्रोफेसरियल PHP6" (Wrox) पढ़ रहा हूं और यह अपना स्वयं का संग्रह कार्यान्वयन दिखाता है। मुझे एसपीएल के आधार पर http://aheimlich.dreamhosters.com/generic-collections/Collection.phps में से एक जैसे अन्य क्लोज़ मिल गए हैं। मैंने यह भी पाया है कि एसपीएल (ArrayObject)

पर कुछ प्रकार का संग्रह है, हालांकि, मुझे आश्चर्य है क्योंकि मैं वास्तव में PHP में संग्रह का उपयोग करने वाले लोगों को नहीं देखता, वे सरणी पसंद करते हैं।

तो, क्या जावा में संग्रहों का उपयोग करना एक अच्छा विचार नहीं है जैसे लोग जावा में मूल सरणी के बजाय ArrayList का उपयोग करते हैं? आखिरकार, PHP arrays वास्तव में जावा सरणी की तरह नहीं हैं।

+3

क्या आप PHP के सरणी पर जावा के संग्रह का लाभ इंगित कर सकते हैं? Enterprisey देखने के अलावा? –

+0

दरअसल, PHP में सेट कार्यान्वयन करना अच्छा होता, लेकिन पाइथन के सेट की तरह कुछ। –

+0

मैंने नीचे दिए गए मेरे उत्तर में वास्तव में एक सरल कार्यान्वयन प्रदान किया है। –

उत्तर

19

जावा में संग्रह बहुत दृढ़ता से बनाते हैं क्योंकि यह दृढ़ता से टाइप की गई भाषा है। यह "कार" और "मोटरबाइक" में से एक का संग्रह करने का अर्थ है।

हालांकि, PHP में, गतिशील रूप से टाइप की गई प्रकृति के कारण, संग्रह की औपचारिकता को त्यागना आम बात है। विभिन्न ऑब्जेक्ट प्रकारों (कार, मोटरबाइक इत्यादि) के सामान्य कंटेनर के रूप में उपयोग करने के लिए Arrays पर्याप्त हैं। इसके अलावा, अतिरिक्त लाभ इस तथ्य से आता है कि सरणी को आसानी से उत्परिवर्तित किया जा सकता है (जब कभी-कभी उचित त्रुटि जांच अनुपस्थित होती है तो कभी भी एक बड़ा नुकसान हो सकता है)।

मैं जावा पृष्ठभूमि से आया हूं, और मुझे पता चला है कि PHP में संग्रह डिज़ाइन पैटर्न का उपयोग फायदे के रास्ते में ज्यादा नहीं खरीदता है (कोई बहु थ्रेडिंग नहीं, स्मृति आवंटन का कोई अनुकूलन नहीं, कोई इटरेटर नहीं है।)।

यदि आप इनमें से किसी भी फायदे की तलाश में हैं, तो संभवतया सरणी के चारों ओर एक रैपर वर्ग बनाने के लिए बेहतर है, प्रत्येक सुविधा (इटरेटर, इत्यादि) को ला कार्टे लागू करना।

+0

अपने स्वयं के रैपर वर्ग का निर्माण करने के लिए ऐसी मूलभूत चीज़ के लिए गैर स्टैंडएट क्लास का उपयोग करने का नुकसान होता है। क्या एसपीएल का ऐरे ऑब्जेक्ट एक रैपर है? – ktulur

+1

सहमत हैं, किसी भी कस्टम रैपर को गैर-मानक होने का नुकसान होता है, लेकिन यह इतना बुरा नहीं हो सकता है क्योंकि वास्तव में मानक संग्रह रैपर नहीं है। मैंने वास्तव में एसपीएल के ऐरे ऑब्जेक्ट के साथ काम नहीं किया है, लेकिन दस्तावेज़ों को देखकर (http://www.php.net/~helly/php/ext/spl/classArrayObject.html), ऐसा लगता है कि यह एक रैपर वर्ग है एक क्लोन समारोह और iterators जोड़ता है। यदि आपको यह सब कुछ चाहिए, तो मैं इसका उपयोग करने की सलाह दूंगा। लेकिन अगर आपको सिंक्रनाइज़ेशन, लिंक्डलिस्ट बनाम सरणीसूची आदि की आवश्यकता है, तो आपको शायद अपना खुद का रैपर लिखने या ArrayObject का विस्तार करने की आवश्यकता होगी। – Pras

+0

पूरी तरह से सहमत हैं, लेकिन कभी-कभी आप केवल एक बुनियादी आश्वासन चाहते हैं कि एक सरणी में केवल एक प्रकार का ऑब्जेक्ट होता है। मेरे पास एक सरल कार्यान्वयन है जिसका उपयोग मैं करता हूं - –

5

PHP सरणी सहयोगी हैं ... वे जावा के सरणी से कहीं अधिक शक्तिशाली हैं, और सूची <> और मानचित्र <> की अधिक कार्यक्षमता शामिल हैं।

"अच्छा विचार" से आपका क्या मतलब है? वे अलग-अलग औजार होते हैं, जिस तरह से आप किसी अन्य भाषा का उपयोग करते हैं, आमतौर पर निराशा होती है।

+0

से नीचे मेरा उत्तर देखें, बहुत सारे ओओ डिज़ाइन पैटर्न हैं जिनका उपयोग PHP में किया जा रहा है और PHP5 ओओ वास्तव में जावा-समान है इसलिए किसी प्रकार के संग्रह का उपयोग करना मेरे लिए एक अच्छा विचार था । – ktulur

+2

तथ्य यह है कि PHP ने जावा से कुछ चीजें उधार ली हैं, यह एक अच्छी बात नहीं है। –

+0

मुझे लगता है कि मैं उलझन में हूँ। आप _do_ "संग्रह" है। उन्हें अभी "सूची" या "मानचित्र" नाम नहीं दिया गया है। PHP arrays गतिशील रूप से बढ़ेगा। आप कुंजी/मूल्य जोड़ों को जोड़ सकते हैं। सेट थोड़ा अलग जानवर हैं, लेकिन हे, वहां बहुत ज्यादा ढेर नहीं कर सकते हैं। :) जावा से आ रहा है यह निश्चित रूप से वहां एक अजीब दुनिया है, लेकिन इन मतभेदों और उनके साथ आने वाले ट्रेडऑफ को गले लगाओ! –

3

मैं, कुछ भी PHP में संग्रह प्रकार कक्षाओं को खोजने के लिए कुछ हद तक निराश था। मेरे अनुभव में Arrays के कुछ वास्तविक नुकसान हैं।

सबसे पहले, उन्हें कुशल बनाने के लिए उपलब्ध कार्यों की संख्या कुछ हद तक सीमित है। उदाहरण के लिए, मुझे किसी दिए गए इंडेक्स स्थिति में संग्रह से/से वस्तुओं को मनमाने ढंग से डालने और निकालने में सक्षम होना चाहिए। ऐसा करना कि PHP में सरणी के लिए अंतर्निहित भाषा फ़ंक्शंस के साथ सबसे अच्छा दर्दनाक है।

दूसरा, पहली बिंदु के ऑफशूट के रूप में दूसरा, स्वच्छ, पठनीय कोड लिखना जो सरल धक्का/पॉप और इटरेटर सामग्री से परे जटिलता के किसी भी स्तर पर सरणी का उपयोग करना मुश्किल है। मुझे अक्सर लगता है कि मुझे इंडेक्स में एक सरणी का उपयोग करना है और मेरे द्वारा बनाए गए डेटा-गहन ऐप्स में एक और सरणी का ट्रैक रखना है।

मैं एक ढांचे में काम करना पसंद करता हूं (मेरी व्यक्तिगत पसंद NOLOH है)। वहां, मेरे पास ArrayList नामक एक वास्तविक संग्रह श्रेणी है जिसमें कार्य, सम्मिलित करें, निकालें, निकालें और निकालें जैसे फ़ंक्शन हैं। मुझे लगता है कि अन्य PHP ढांचे इस मुद्दे को भी संबोधित करते हैं।

6

मैं PHP में बहुत प्रो संग्रह ऑब्जेक्ट्स हूं, इन्हें टाइप सुरक्षा, इंपीमेंट को खोज, सॉर्ट और हेरफेर कार्यक्षमता का उपयोग करने में आसान प्रत्यारोपण, और सही ओओ दृष्टिकोण का प्रतिनिधित्व करने के बजाय उपयोग किया जा सकता है, फिर सरणी और उपयोगी लेकिन प्रक्रियात्मक भीड़ का उपयोग करना कार्य जो उन सभी स्रोतों पर अलग-अलग पैटर्न में काम करते हैं।

हमारे पास विभिन्न संग्रह हैं जो हम विभिन्न उद्देश्यों के लिए उपयोग करते हैं, जो सभी प्रकार की विरासत में प्रचारित सुरक्षा प्रकार, निरंतर कोडिंग मानकों और उच्च स्तर के कोड पुन: उपयोग के लिए उपयोग करते हैं।

लेकिन अल्टीमेटली, वे सभी सरणी आंतरिक रूप से हैं!

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

0

चरबी में संग्रह का एक अच्छा कार्यान्वयन वैरिएन लिब द्वारा प्रदान किया जाता है, यह पुस्तकालय ओएसएल लाइसेंस के साथ Magento कोड का हिस्सा है। (Magento लाइसेंस और कोड पुन: उपयोग here बारे में अधिक जानकारी।

तो सबसे अच्छा तरीका है Magento डाउनलोड करें और फिर/lib/Varien पर गौर करना है पुस्तकालय के लिए किसी भी स्रोत कोड नहीं खोजा जा सका/

0

मैं कभी कभी यह वास्तव में सरल कार्यान्वयन का उपयोग मुझे एक किसी न किसी और के लिए तैयार संग्रह देने के लिए।

आम तौर पर एक स्तंभ की मुख्य आवश्यकता लीक्शन एक प्रकार के ऑब्जेक्ट के समूह को लागू कर रहा है, आपको बस इसे लागू करने के लिए एक कन्स्ट्रक्टर के साथ एक मूल वर्ग स्थापित करना होगा।

class SomeObjectCollection { 

    /** 
    * @var SomeObject[] 
    */ 
    private $collection = array(); 

    /** 
    * @param SomeObject $object1 
    * @param SomeObject $_ [optional] 
    */ 
    function __construct(SomeObject $object1 = null, SomeObject $_ = null) 
    { 
     foreach (func_get_args() as $index => $arg) { 
      if(! $arg instanceof SomeObject) throw new \RuntimeException('All arguments must be of type SomeObject'); 
      $this->collection[] = $arg; 
     } 
    } 

    /** 
    * @return SomeObject[] 
    */ 
    public function getAll() 
    { 
     return $this->collection; 
    } 
} 
संबंधित मुद्दे