PHP में Generics: क्यों आवश्यक हैं और कैसे उपयोग करें
PHP में आधुनिक विकास के लिए न केवल गति बल्कि कोड की विश्वसनीयता भी आवश्यक है। इस लक्ष्य को प्राप्त करने में सहायक उपकरणों में से एक हैं Generics (सामान्यीकृत प्रकार)। इस तथ्य के बावजूद कि PHP एक डायनामिक टाइपिंग वाली भाषा है, PHP 7.0 और उससे ऊपर, विशेष रूप से PHP 8.0 के आगमन के साथ, स्टैटिक टाइपिंग उपलब्ध और मांग में हो गई है। Generics आपको प्रकारों के बारे में जानकारी खोए बिना अधिक लचीली, पुन: प्रयोज्य और सुरक्षित डेटा संरचनाएं, जैसे संग्रह, स्टैक, कतारें और रिपॉजिटरी लिखने की अनुमति देते हैं।
इस लेख में, हम विस्तार से समझेंगे कि PHP में Generics क्या हैं, वे क्यों आवश्यक हैं, व्यवहार में उनका सही उपयोग कैसे करें, और कोड के विशिष्ट उदाहरण देखेंगे।
Generics क्या हैं और वे क्यों आवश्यक हैं?
Generics (सामान्यीकृत प्रकार) एक तंत्र है जो कक्षाओं, इंटरफेस, ट्रेट्स और फ़ंक्शन को डेटा प्रकार के साथ पैरामीटराइज़ करने की अनुमति देता है। प्रत्येक प्रकार के लिए अलग-अलग कार्यान्वयन लिखने के बजाय (जैसे, IntegerList, StringList, UserList), आप एक सार्वभौमिक वर्ग List<T> बनाते हैं, जहाँ T उपयोग करते समय पारित किए जाने वाले विशिष्ट प्रकार के लिए एक प्लेसहोल्डर (स्थानापन्न) है।
यह क्यों आवश्यक है?
- प्रकार सुरक्षा: IDE और स्टैटिक विश्लेषक (Psalm, PHPStan) जांच सकते हैं कि संग्रह में केवल एक ही प्रकार के तत्व आते हैं, जिससे विकास के चरण में त्रुटियों को रोका जा सकता है।
- कोड दोहराव में कमी: आपको विभिन्न डेटा प्रकारों के लिए एक ही वर्ग लिखने की आवश्यकता नहीं है।
- पठनीयता में सुधार: कोड स्व-दस्तावेज़ीकरण बन जाता है - तुरंत दिखाई देता है कि किस प्रकार के डेटा की अपेक्षा की जाती है।
- प्रदर्शन में वृद्धि: हालाँकि PHP स्वयं वर्चुअल मशीन स्तर पर Generics का उपयोग नहीं करता है (जैसे Java या C#), स्टैटिक विश्लेषक कोड निष्पादित होने से पहले संभावित त्रुटियों को खोजने में मदद करते हैं।
PHP में Generics का उपयोग कैसे करें? सिंटैक्स और उदाहरण
PHP 8.0 से शुरू होकर, एनोटेशन (docblock) स्तर पर और आंशिक रूप से कोड स्तर पर (variadic arguments के लिए) Generics का समर्थन शुरू किया गया था। सिंटैक्स स्तर पर पूर्ण समर्थन भविष्य के संस्करणों में अपेक्षित है, लेकिन अभी भी PHPDoc और स्टैटिक विश्लेषकों की मदद से Generics का प्रभावी ढंग से उपयोग किया जा सकता है।
1. PHPDoc के साथ मूल सिंटैक्स
सबसे सामान्य तरीका सामान्यीकृत प्रकार को निर्दिष्ट करने के लिए @template और @param/@return एनोटेशन का उपयोग करना है।
<?php
/** * @template T */class Collection { /** @var array<T> */ private array $items;
/** * @param T $item */ public function add($item): void { $this->items[] = $item; }
/** * @return T|null */ public function get(int $index) { return $this->items[$index] ?? null; }}
// उपयोग का उदाहरण$intCollection = new Collection();$intCollection->add(42);// $intCollection->add('string'); // स्टैटिक विश्लेषक त्रुटि
$userCollection = new Collection();$userCollection->add(new User());// $userCollection->add(123); // त्रुटि?>इस उदाहरण में, @template T एक सामान्यीकृत प्रकार घोषित करता है। @param T $item और @return T|null विश्लेषक को बताते हैं कि तत्वों का प्रकार सुसंगत होना चाहिए।
2. प्रकार प्रतिबंध (bounded generics)
आप सीमित कर सकते हैं कि पैरामीटर के रूप में किन प्रकारों का उपयोग किया जा सकता है। यह @extends या @implements के साथ किया जाता है।
<?php
/** * @template T of \\Stringable */class StringableCollection { /** @var array<T> */ private array $items;
/** * @param T $item */ public function add($item): void { $this->it