PHP एक मिश्रित प्रतिमान भाषा है, जो गैर-ऑब्जेक्ट डेटा प्रकारों, जैसे सरणियों का उपयोग और वापस करने की अनुमति देती है। जब कोई प्रोग्रामिंग किसी विशेष स्थिति में उपयोग करने के लिए निर्माण का निर्णय लेती है, तो मैं एरे बनाम ऑब्जेक्ट्स के चयन के लिए कुछ दिशानिर्देशों को स्पष्ट करने का प्रयास करने के लिए एक प्रश्न खड़ा करता हूं।
यह वास्तव में PHP भाषा निर्माणों का उपयोग करके डेटा को एन्कोड करने के तरीकों के बारे में एक सवाल है और जब डेटा पासिंग उद्देश्यों (यानी सेवा-उन्मुख वास्तुकला या वेब सेवाओं) के लिए एक से अधिक तरीके से दूसरे को चुना जाना है।
उदाहरण
मान लें कि आपके पास {cost, name, part_number, item_count} से मिलकर एक आइटम प्रकार है। आपका प्रोग्राम कई ऐसे आइटम प्रकारों को प्रदर्शित करने के लिए कहता है, जहाँ आप प्रत्येक आइटम प्रकार को रखने के लिए बाहरी कंटेनर के रूप में एक सरणी का उपयोग करने का निर्णय लेते हैं। [आप ArrayObject
OO प्रतिमान के लिए PHP का भी उपयोग कर सकते हैं , लेकिन मेरा प्रश्न उस (बाहरी) सरणी के बारे में नहीं है ]। मेरा प्रश्न आइटम प्रकार के डेटा को कैसे एन्कोड करना है, और किस प्रतिमान का उपयोग करना है। PHP आपको उपयोग करने की अनुमति देता है PHP Native Arrays
या PHP Objects
।
मैं इस तरह के डेटा को दो तरीकों से इनकोड कर सकता हूं, जैसे:
//PHP's associative arrays:
$ret = array(
0 => array(
'cost' => 10.00,
'name' => 'item1',
'part_number' => 'zyz-100',
'item_count' => 15
),
1 => array(
'cost' => 34.00,
'name' => 'item2',
'part_number' => 'abc-230',
'item_count' => 42
),
);
बनाम
//here ItemType is encapsulated into an object
$ret = array(
0 => new ItemType(10.00, 'item1', 'zyz-100', 15),
1 => new ItemType(34.00, 'item2', 'abc-230', 42),
);
class ItemType
{
private $price;
private $name;
private $partNumber;
private $itemCount;
function __construct($price, $name, $partNumber, $itemCount) {..}
}
मैं क्या सोच रहा हूँ
ऐरे एन्कोडिंग हल्का-वजन है, और अधिक JSON- तैयार है, लेकिन गड़बड़ करने में आसान हो सकता है। साहचर्य सरणी कुंजियों में से एक गलत वर्तनी और आपके पास एक त्रुटि हो सकती है जिसे पकड़ना अधिक कठिन है। लेकिन फुसफुसाहट पर बदलना भी आसान है। कहो कि मैं item_count
अब और स्टोर नहीं करना चाहता , मैं किसी भी टेक्स्ट-प्रोसेसिंग सॉफ्टवेयर का उपयोग करके आसानी item_count
से सरणी में सभी उदाहरणों को हटा सकता हूं और फिर अन्य कार्यों को अपडेट कर सकता हूं जो तदनुसार उपयोग करते हैं। यह एक अधिक थकाऊ प्रक्रिया हो सकती है, लेकिन यह सरल है।
ऑब्जेक्ट ओरिएंटेड एन्कोडिंग आईडीई और पीएचपी भाषा सुविधाओं पर कॉल करता है और पहले से किसी भी त्रुटि को पकड़ना आसान बनाता है, लेकिन पहले स्थान पर प्रोग्राम और कोड करना कठिन है। मैं मुश्किल से कहता हूं, क्योंकि आपको अपनी वस्तुओं के बारे में थोड़ा सोचना होगा, आगे की सोचना होगा, और OO कोडिंग सरणी संरचनाओं को टाइप करने की तुलना में थोड़ा अधिक संज्ञानात्मक भार लेता है। एक बार यह कोडित हो जाने के बाद, कुछ बदलावों को लागू करना आसान हो जाता है, एक अर्थ में, इसे हटाना item_count
, उदाहरण के लिए, कोड की कम लाइनों को बदलने की आवश्यकता होगी। लेकिन खुद को बदलने के लिए अभी भी सरणी विधि की तुलना में एक उच्च संज्ञानात्मक भार की आवश्यकता हो सकती है, क्योंकि उच्च-स्तरीय ओओ सुविधाएं शामिल हैं।
सवाल
कुछ मामलों में यह स्पष्ट है, उन मामलों की तरह जहां मुझे डेटा पर हेरफेर करने की आवश्यकता होगी। लेकिन कुछ मामलों में, जहां मुझे "आइटम प्रकार" डेटा की कुछ पंक्तियों को संग्रहीत करने की आवश्यकता होती है, मेरे पास यह स्पष्ट दिशा-निर्देश या विचार नहीं हैं कि जब ऐरे का उपयोग करना है या क्या वस्तुओं का निर्माण करना है, यह तय करने का प्रयास करना है। ऐसा लगता है कि मैं सिर्फ एक सिक्का उछाल सकता हूं और एक चुन सकता हूं। क्या यहाँ भी ऐसा ही है?
array
, 2: User-defined Class
, 3: stdClass
। गति की तुलना में प्रदर्शन बहुत अधिक है array
और तुलना करते समय User-defined class
(जैसे कि आपके ItemType
), लेकिन परिभाषित class
एस का उपयोग करके कम मेमोरी का उपयोग करने की प्रवृत्ति है array
। stdClass
दूसरी ओर तीन विकल्पों में सबसे धीमा है और सबसे अधिक मेमोरी का भी उपयोग करता है।
(object)['foo'=>'bar']
:। परिणामी मूल्य में वर्ग हैStdClass
, JSON द्वारा पूरी तरह से एन्कोड कियाjson_encode()
जाएगा और गुणों को आसानी से सरणी सूचकांकों के रूप में आसानी से बदला जा सकता है (जो हमेशा इतना आसान नहीं होता है, जब इसे एक चर के माध्यम से अप्रत्यक्ष रूप से एक्सेस किया जाता है)। हालांकि, ऐसे मूल्यों पर अलग-अलग संचालन हैं; उदाहरण के लिए, आपके पास ऑब्जेक्ट यूनियन्स नहीं हैं क्योंकि आपके पास सरणी यूनियन हैं, और आप सीधेarray_*()
फ़ंक्शन का उपयोग नहीं कर सकते हैं ।