परिचय
जैसा कि नाम से पता चलता है, एनोनिमस क्लास वह होती है जिसका कोई नाम नहीं होता। यह एक बार के उपयोग के लिए होती है, और जब किसी को तुरंत एक क्लास परिभाषित करने की आवश्यकता होती है। एनोनिमस क्लास की सुविधा PHP 7 संस्करण से पेश की गई है।
एनोनिमस क्लास की परिभाषा एक एक्सप्रेशन के अंदर होती है जिसका परिणाम उस क्लास का ऑब्जेक्ट होता है। इसे new class सिंटैक्स के साथ परिभाषित किया जाता है:
सिंटैक्स
<?php
$obj = new class {
public function sayhello() {
echo "Hello World";
}
};
$obj->sayhello();
?>
एनोनिमस क्लास वह सब कुछ कर सकती है जो एक सामान्य क्लास कर सकती है यानी दूसरी क्लास को एक्सटेंड करना, इंटरफेस इम्प्लीमेंट करना या ट्रेट उपयोग करना।
उदाहरण: एक्सटेंड और इम्प्लीमेंट्स
निम्न कोड में, एक एनोनिमस क्लास parentclass को एक्सटेंड करती है और parentinterface को इम्प्लीमेंट करती है:
<?php
class parentclass {
public function test1() {
echo "test1 method in parent class\n";
}
}
interface parentinterface {
public function test2();
}
$obj = new class() extends parentclass implements parentinterface {
public function test2() {
echo "implements test2 method from interface";
}
};
$obj->test1();
$obj->test2();
?>
आउटपुट
test1 method in parent class implements test2 method from interface
नेस्टेड एनोनिमस क्लास
एनोनिमस क्लास को दूसरी क्लास के मेथड बॉडी के अंदर नेस्ट किया जा सकता है। हालांकि, इसके ऑब्जेक्ट की बाहरी क्लास के private या protected मेंबर्स तक पहुंच नहीं होती।
<?php
class testclass {
public function test1() {
return new class() {
public function test2() {
echo "test2 method of nested anonymous class";
}
};
}
}
$obj2 = new testclass();
$obj2->test1()->test2();
?>
आउटपुट
test2 method of nested anonymous class
एनोनिमस क्लास का आंतरिक नाम
PHP पार्सर आंतरिक उपयोग के लिए एनोनिमस क्लास को एक यूनिक नाम देता है:
<?php
var_dump(get_class(new class() {}));
?>
आउटपुट
string(60) "class@anonymous/home/cg/root/1569997/main.php0x7f1ba68da026"
उपयोग के मामले
- सरल वैल्यू ऑब्जेक्ट्स या DTOs के लिए जो केवल एक बार उपयोग होते हैं।
- टेस्टिंग में मॉक ऑब्जेक्ट्स बनाने के लिए।
- कॉलबैक हैंडलर्स के लिए जो एक ही स्थान पर परिभाषित और उपयोग किए जाते हैं।
- लाइब्रेरी कोड में जहां यूजर को क्लास नाम देने की आवश्यकता नहीं होती।
सीमाएं
- सीरियलाइज़ नहीं किया जा सकता (PHP 7.4+ में __serialize/__unserialize के साथ संभव)।
- नेस्टेड एनोनिमस क्लास बाहरी क्लास के private/protected मेंबर्स एक्सेस नहीं कर सकती।
- क्लास नाम रनटाइम पर जनरेट होता है, इसलिए टाइप हिंटिंग में उपयोग नहीं किया जा सकता।