वास्तव में छोटा संस्करण सरल है क्योंकि आप नहीं कर सकते। यही नहीं ट्रिट्स काम करते हैं।
जब आप use SomeTrait;
PHP में लिखते हैं तो आप (प्रभावी रूप से) संकलक को उस वर्ग में ट्रेट से कोड को कॉपी और पेस्ट करने के लिए कह रहे हैं जहां इसका उपयोग किया जा रहा है।
क्योंकि वह use SomeTrait;
कक्षा के अंदर है implements SomeInterface
, इसलिए वह कक्षा में नहीं जुड़ सकता , क्योंकि उसे कक्षा के बाहर रहना पड़ता है।
"क्यों PHP में लक्षण टाइप नहीं हैं?"
क्योंकि वे तात्कालिक नहीं हो सकते। लक्षण वास्तव में सिर्फ एक भाषा निर्माण (इस वर्ग में गुण कोड को कॉपी और पेस्ट करने के लिए कहकर) एक वस्तु या प्रकार के विपरीत है जिसे आपके कोड द्वारा संदर्भित किया जा सकता है।
इसलिए, मैं कोड में "डिज़ाइन" करना चाहता हूं जो कि मेरी विशेषता का उपयोग करने वाले प्रत्येक वर्ग को इंटरफ़ेस को लागू करना है।
यह एक अमूर्त वर्ग का उपयोग कर use
विशेषता के लिए लागू किया जा सकता है और फिर उसमें से कक्षाओं का विस्तार किया जा सकता है।
interface SomeInterface{
public function someInterfaceFunction();
}
trait SomeTrait {
function sayHello(){
echo "Hello my secret is ".static::$secret;
}
}
abstract class AbstractClass implements SomeInterface{
use SomeTrait;
}
class TestClass extends AbstractClass {
static public $secret = 12345;
}
$test = new TestClass();
$test->sayHello();
हालाँकि - यदि आपको यह लागू करने की आवश्यकता है कि कोई भी वर्ग जो Trait का उपयोग करता है, उसकी एक विशेष विधि है, तो मुझे लगता है कि आप उन लक्षणों का उपयोग कर रहे होंगे, जहाँ आपको पहली बार में अमूर्त वर्ग होना चाहिए था।
या कि आपके पास अपना तर्क गलत तरीका है। आपको उन कक्षाओं की आवश्यकता होती है जो इंटरफेस को लागू करने के कुछ कार्य हैं, न कि यदि उनके पास कुछ कार्य हैं जो उन्हें स्वयं को एक इंटरफ़ेस को लागू करने के रूप में घोषित करना चाहिए।
संपादित करें
वास्तव में आप विधि को लागू करने के लिए एक वर्ग को मजबूर करने के लिए लक्षण के अंदर सार कार्यों को परिभाषित कर सकते हैं। जैसे
trait LoggerTrait {
public function debug($message, array $context = array()) {
$this->log('debug', $message, $context);
}
abstract public function log($level, $message, array $context = array());
}
हालाँकि यह अभी भी आपको विशेषता को इंटरफ़ेस में लागू करने की अनुमति नहीं देता है, और फिर भी एक खराब डिज़ाइन की तरह बदबू आ रही है, क्योंकि इंटरफेस एक अनुबंध को परिभाषित करने में लक्षण से बेहतर है जो एक वर्ग को पूरा करने की आवश्यकता है।