परिचय
PHP मल्टीपल इनहेरिटेंस का समर्थन नहीं करता। इस सीमा को ट्रेट्स (traits) फीचर द्वारा कुछ हद तक दूर किया जाता है। यह कोड पुन: उपयोग का एक तंत्र है। ट्रेट की परिभाषा क्लास के समान है। हालांकि, इसे सीधे इंस्टेंशिएट नहीं किया जा सकता। इसके बजाय, use कीवर्ड द्वारा ट्रेट की कार्यक्षमता को एक क्लास के लिए उपलब्ध कराया जाता है। इसलिए, एक क्लास ट्रेट में परिभाषित मेथड्स का लाभ उठा सकती है या उन्हें ओवरराइड भी कर सकती है। यह किसी अन्य पैरेंट क्लास के अतिरिक्त है जिससे यह विरासत में मिल रही हो।
एक ट्रेट एक इंटरफ़ेस के समान भी है। अंतर यह है कि इंटरफ़ेस इसके अंदर मेथड की परिभाषा प्रदान नहीं करता, जिसे इम्प्लीमेंटिंग क्लास द्वारा किया जाना चाहिए। ट्रेट मेथड हालांकि परिभाषा प्रदान करता है, जिसे ट्रेट का उपयोग करने वाली क्लास द्वारा ओवरराइड किया जा सकता है या नहीं भी किया जा सकता।
सिंटैक्स
<?php
trait testtrait {
public function test1() {
// मेथड बॉडी
}
}
// ट्रेट का उपयोग
class testclass {
use testtrait;
// क्लास में शेष सदस्य
}
?>
उदाहरण
उदाहरण 1: ट्रेट का उपयोग और मेथड ओवरराइड
निम्न कोड में, दो मेथड्स वाले ट्रेट का उपयोग एक क्लास में किया जाता है जो उनमें से एक को ओवरराइड करती है:
<?php
// ट्रेट की परिभाषा
trait testtrait {
public function test1() {
echo "test1 method in trait\n";
}
public function test2() {
echo "test2 method in trait\n";
}
}
// ट्रेट का उपयोग
class testclass {
use testtrait;
public function test1() {
echo "test1 method overridden\n";
}
}
$obj = new testclass();
$obj->test1();
$obj->test2();
?>
आउटपुट
test1 method overridden test2 method in trait
उदाहरण 2: चाइल्ड क्लास में ट्रेट - प्रभावी मल्टीपल इनहेरिटेंस
यह ट्रेट का मुख्य लाभ है। एक पैरेंट क्लास वाली क्लास भी ट्रेट का उपयोग कर सकती है और इसके मेथड को ओवरराइड करना चुन सकती है। इस प्रकार प्रभावी रूप से मल्टीपल इनहेरिटेंस प्राप्त करना।
<?php
// ट्रेट की परिभाषा
trait testtrait {
public function test1() {
echo "test1 method in trait\n";
}
}
// पैरेंट क्लास
class parentclass {
public function test2() {
echo "test2 method in parent\n";
}
}
// ट्रेट और पैरेंट क्लास का उपयोग
class childclass extends parentclass {
use testtrait;
public function test1() {
echo "parent method overridden\n";
}
public function test2() {
echo "trait method overridden\n";
}
}
$obj = new childclass();
$obj->test1();
$obj->test2();
?>
आउटपुट
parent method overridden trait method overridden
उदाहरण 3: इंटरफ़ेस के साथ ट्रेट
एक क्लास का एक इंटरफ़ेस इम्प्लीमेंट करना, दूसरी पैरेंट क्लास एक्सटेंड करना और ट्रेट का उपयोग करना एक ही समय में संभव है।
<?php
// ट्रेट की परिभाषा
trait mytrait {
public function test1() {
echo "test1 method in trait1\n";
}
}
class myclass {
public function test2() {
echo "test2 method in parent class\n";
}
}
interface myinterface {
public function test3();
}
// ट्रेट और पैरेंट क्लास का उपयोग
class testclass extends myclass implements myinterface {
use mytrait;
public function test3() {
echo "implementation of test3 method\n";
}
}
$obj = new testclass();
$obj->test1();
$obj->test2();
$obj->test3();
?>
आउटपुट
test1 method in trait1 test2 method in parent class implementation of test3 method
उदाहरण 4: संघर्ष समाधान (Conflict Resolution)
यदि कोई क्लास एक सामान्य मेथड वाले दो ट्रेट्स का उपयोग करती है, तो उनके संघर्ष को स्कोप रिज़ॉल्यूशन ऑपरेटर और insteadof कीवर्ड द्वारा हल किया जाता है।
<?php
trait trait1 {
public function test1() {
echo "test1 method in trait1\n";
}
public function test2() {
echo "test2 method in trait1\n";
}
}
trait trait2 {
public function test1() {
echo "test1 method in trait2\n";
}
public function test2() {
echo "test2 method in trait2\n";
}
}
// ट्रेट्स का उपयोग
class testclass {
use trait1, trait2 {
trait1::test1 insteadof trait2;
trait2::test2 insteadof trait1;
}
}
$obj = new testclass();
$obj->test1();
$obj->test2();
?>
आउटपुट
test1 method in trait1 test2 method in trait2