मैं रॉबर्ट सी। मार्टिन द्वारा "क्लीन कोड" में उल्लिखित - स्वच्छ कोड पढ़ना और लिखना पसंद करता हूं। जब आप अपने क्रेडेंशियल का पालन कर रहे हों, तो आपको अपने एरे के स्ट्रक्चर (आंतरिक) को जानने के लिए डेवलपर (आपके एपीआई के उपयोगकर्ता के रूप में) की आवश्यकता नहीं होनी चाहिए।
एपीआई उपयोगकर्ता पूछ सकता है: क्या केवल एक आयाम वाला एक सरणी है? क्या वस्तुएं एक बहुआयामी सरणी के सभी स्तरों पर चारों ओर फैली हुई हैं? कितने नेस्टेड लूप (फोरचेक, आदि) मुझे सभी वस्तुओं तक पहुंचने की आवश्यकता है? उस सरणी में किस प्रकार की वस्तुएं "संग्रहीत" हैं?
जैसा कि आपने उल्लिखित किया है कि आप उस सरणी का उपयोग करना चाहते हैं (जिसमें वस्तुएं हैं) एक आयामी सरणी के रूप में।
निशि द्वारा उल्लिखित के रूप में आप उपयोग कर सकते हैं:
/**
* @return SomeObj[]
*/
उसके लिए।
लेकिन फिर से: जागरूक रहें - यह एक मानक डॉकब्लॉक नोटेशन नहीं है। यह नोटेशन कुछ IDE उत्पादकों द्वारा पेश किया गया था।
ठीक है, ठीक है, एक डेवलपर के रूप में आप जानते हैं कि "[]" PHP में एक सरणी से बंधा है। लेकिन सामान्य PHP संदर्भ में "कुछ []" का क्या अर्थ है? "[]" का अर्थ है: "कुछ" के भीतर नया तत्व बनाना। नया तत्व सब कुछ हो सकता है। लेकिन आप जो व्यक्त करना चाहते हैं वह है: एक ही प्रकार की वस्तुओं की सरणी और यह सटीक प्रकार है। जैसा कि आप देख सकते हैं, आईडीई निर्माता एक नया संदर्भ प्रस्तुत करता है। एक नया संदर्भ जो आपको सीखना था। एक नया संदर्भ अन्य PHP डेवलपर्स को सीखना था (अपने डॉकब्लॉक्स को समझने के लिए)। खराब शैली (!)।
क्योंकि आपके सरणी में एक आयाम है जिसे आप शायद "ऑब्जेक्ट की सरणी" को "सूची" कहना चाहते हैं। ज्ञात हो कि "सूची" का अन्य प्रोग्रामिंग भाषाओं में एक बहुत ही विशेष अर्थ है। उदाहरण के लिए इसे "संग्रह" कहना बेहतर होगा।
याद रखें: आप एक प्रोग्रामिंग भाषा का उपयोग करते हैं जो आपको OOP के सभी विकल्पों में सक्षम बनाती है। एक सरणी के बजाय एक वर्ग का उपयोग करें और अपनी कक्षा को एक सरणी की तरह ट्रैवर्सेबल बनाएं। उदाहरण के लिए:
class orderCollection implements ArrayIterator
या यदि आप एक बहुआयामी सरणी / ऑब्जेक्ट संरचना में विभिन्न स्तरों पर आंतरिक वस्तुओं को संग्रहीत करना चाहते हैं:
class orderCollection implements RecursiveArrayIterator
यह समाधान आपके सरणी को "ऑर्डरकॉलक्शन" के प्रकार से बदल देता है, लेकिन अब तक आपके आईडीई के भीतर कोड पूरा करने में सक्षम नहीं है। ठीक है। अगला कदम:
Docblocks के साथ इंटरफेस द्वारा पेश किए गए तरीकों को लागू करें - विशेष:
/**
* [...]
* @return Order
*/
orderCollection::current()
/**
* [...]
* @return integer E.g. database identifier of the order
*/
orderCollection::key()
/**
* [...]
* @return Order
*/
orderCollection::offsetGet()
इसके लिए टाइपिंग का उपयोग करना न भूलें:
orderCollection::append(Order $order)
orderCollection::offsetSet(Order $order)
यह समाधान बहुत कुछ शुरू करता है:
/** @var $key ... */
/** @var $value ... */
सभी कोड फ़ाइलों पर (जैसे छोरों के भीतर), जैसा कि ज़ाहिमाका ने उसके / उसके जवाब की पुष्टि की है। आपका API उपयोगकर्ता उस डॉकब्लॉक को लागू करने के लिए मजबूर नहीं होता है, जिसके पास कोड पूरा होने के लिए है। केवल एक जगह पर @return होने से अतिरेक (@var) को यथासंभव कम कर देता है। "DvarBlocks with @var" को छिड़कना आपके कोड को सबसे अधिक पठनीय बना देगा।
फाइनली आप हो गए। मुश्किल से हासिल होता है? लगता है कि एक अखरोट को तोड़ने के लिए स्लेजहैमर ले रहा है? वास्तव में नहीं, क्योंकि आप उस इंटरफेस से और साफ कोड से परिचित हैं। याद रखें: आपका स्रोत कोड एक बार लिखा गया है / कई पढ़ा गया है।
यदि आपके आईडीई का कोड पूरा होने पर इस दृष्टिकोण के साथ काम नहीं किया जाता है, तो बेहतर तरीके से स्विच करें (जैसे इंटेलीजे आईडीईए, पीएचपीओआरएम, नेटबीन्स) या अपने आईडीई निर्माता के समस्या ट्रैकर पर एक सुविधा अनुरोध दर्ज करें।
मेरे ट्रेनर होने और मुझे इतना बढ़िया सामान सिखाने के लिए क्रिश्चियन वीस (जर्मनी से) को धन्यवाद। पुनश्च: मुझे और उसे XING पर मिलो।