PHP में Generics का परिचय: यह क्या है और इसकी आवश्यकता क्यों है
यदि आप अभी PHP सीखना शुरू कर रहे हैं या कुछ समय से इसमें लिख रहे हैं, तो आपने निश्चित रूप से ऐसी स्थिति का सामना किया होगा जहाँ कोई फ़ंक्शन या क्लास विभिन्न डेटा प्रकारों के साथ काम करता है। उदाहरण के लिए, आप एक संग्रह (collection) बनाते हैं जो संख्याओं, स्ट्रिंग्स और ऑब्जेक्ट्स को स्टोर कर सकता है। Generics (सामान्यीकृत प्रकारों) के बिना, आपको या तो प्रत्येक प्रकार के लिए अलग-अलग क्लास लिखनी होती हैं, या मिश्रित प्रकारों (mixed) का उपयोग करना होता है, जो कोड की सुरक्षा को कम करता है।
Generics एक तंत्र है जो आपको ऐसे क्लास, इंटरफ़ेस और फ़ंक्शन बनाने की अनुमति देता है जो विभिन्न डेटा प्रकारों के साथ काम करते हैं, साथ ही सख्त टाइपिंग (strict typing) बनाए रखते हैं। PHP में Generics का समर्थन संस्करण 8.0 से शुरू हुआ, और PHP 8.1 और 8.2 में इसमें काफी सुधार किया गया। इस लेख में, हम समझेंगे कि इनकी आवश्यकता क्यों है, इनका उपयोग कैसे करें और ये क्या लाभ प्रदान करते हैं।
PHP में Generics की आवश्यकता क्यों है?
सामान्यीकृत प्रकारों के अभाव की समस्या
कल्पना करें कि आप तत्वों की सूची के साथ काम करने के लिए एक क्लास लिख रहे हैं। Generics के बिना, आपको mixed प्रकार का उपयोग करना होगा या प्रत्येक डेटा प्रकार के लिए अलग-अलग क्लास लिखनी होंगी:
<?php// Generics के बिना — असुरक्षितclass SimpleList { private array $items = [];
public function add($item): void { $this->items[] = $item; }
public function get(int $index): mixed { return $this->items[$index] ?? null; }}
// उपयोग$list = new SimpleList();$list->add(42);$list->add('स्ट्रिंग'); // कोई त्रुटि नहीं होगी, लेकिन तर्क टूट गया है$value = $list->get(0); // mixed प्रकार — IDE यह नहीं बताएगा कि यह int है?>जैसा कि आप देख सकते हैं, यह दृष्टिकोण संभावित त्रुटियों की ओर ले जाता है: आप गलती से वहाँ एक स्ट्रिंग जोड़ सकते हैं जहाँ केवल संख्याओं की अपेक्षा है, और IDE आपको इसके बारे में चेतावनी नहीं दे पाएगा।
Generics के लाभ
- प्रकार सुरक्षा (Type safety): कंपाइलर और IDE कोड लिखने के चरण में प्रकारों की अनुरूपता की जाँच करते हैं।
- पुन: उपयोग (Reusability): एक क्लास या फ़ंक्शन किसी भी डेटा प्रकार के साथ काम करता है।
- कोड पठनीयता (Readability): तुरंत स्पष्ट हो जाता है कि किन प्रकारों की अपेक्षा है।
- कम त्रुटियाँ (Fewer errors): आकस्मिक प्रकार बेमेल को समाप्त करता है।
Generics के साथ, वही सूची क्लास सुरक्षित और सार्वभौमिक हो जाती है:
<?php// Generics के साथ — सुरक्षितclass GenericList { private array $items = [];
public function add(T $item): void { $this->items[] = $item; }
public function get(int $index): ?T { return $this->items[$index] ?? null; }}
// उपयोग$intList = new GenericList();$intList->add(42);// $intList->add('स्ट्रिंग'); // प्रकार त्रुटि!
$stringList = new GenericList();$stringList->add('नमस्ते');$value = $stringList->get(0); // IDE जानता है कि यह string है?>PHP में Generics का उपयोग कैसे करें
मूल सिंटैक्स
PHP में Generics को कोण कोष्ठक <> और अक्षर T (Type से) का उपयोग करके घोषित किया जाता है — यह प्रकार चर के लिए सामान्यतः स्वीकृत नाम है। आप किसी भी नाम का उपयोग कर सकते हैं, लेकिन T मानक है।
क्लास के साथ उदाहरण:
<?phpclass Container { private T $value;
public function __construct(T $value) { $this->value = $value; }
public function getValue(): T { return $this->value; }}
$intContainer = new Container(100);$stringContainer = new Container('Hello');?>प्रकार प्रतिबंध (Type constraints)
कभी-कभी यह आवश्यक होता है कि प्रकार पैरामीटर एक निश्चित इंटरफ़ेस या क्लास के अनुरूप हो। इसके लिए प्रतिबंध (bounds) का उपयोग किया जाता है:
<?phpinterface Printable { public function print(): string;}
class Document implements Printable { public function print(): string { return 'दस्तावेज़'; }