7.4+:
अच्छी खबर है कि इसे नए रिलीज में लागू किया जाएगा, जैसा कि @Andrea ने बताया। मैं इस समाधान को यहाँ छोड़ दूंगा अगर कोई इसे 7.4 से पहले उपयोग करना चाहता है
7.3 या उससे कम है
इस थ्रेड से मुझे प्राप्त होने वाली सूचनाओं के आधार पर, मेरा मानना है कि वहाँ से बाहर कई लोगों के पास / मेरे पास एक ही मुद्दा है। इस मामले के लिए मेरा समाधान इस व्यवहार को अनुकरण करने के लिए एक विशेषता के अंदर वास + __set
जादू विधि का संयोजन था । यह रहा:
trait SettersTrait
{
public function __set($name, $value)
{
$setter = 'set'.$name;
if (method_exists($this, $setter)) {
$this->$setter($value);
} else {
$this->$name = $value;
}
}
}
और यहाँ प्रदर्शन है:
class Bar {}
class NotBar {}
class Foo
{
use SettersTrait;
private $bar;
protected function setBar(Bar $bar)
{
$this->bar = $bar;
}
}
$foo = new Foo();
$foo->bar = new NotBar();
व्याख्या
सबसे पहले, bar
एक निजी संपत्ति के रूप में परिभाषित करें ताकि PHP __set
स्वचालित रूप से डाली जाएगी ।
__set
जाँच करेगा कि क्या वर्तमान वस्तु ( method_exists($this, $setter)
) में कुछ सेटर घोषित है । अन्यथा यह केवल इसका मूल्य निर्धारित करेगा जैसा कि सामान्य रूप से होता है।
एक सेट्टर विधि (सेटबार) घोषित करें जो एक प्रकार-संकेतित तर्क ( setBar(Bar $bar)
) प्राप्त करता है ।
जब तक PHP यह पता लगा लेती है कि कुछ ऐसा नहीं है जो इंस्टेंटBar
को पास नहीं किया जा रहा है, तो यह ऑटोमैटिकली एक फाल्ट एरर को ट्रिगर करेगा: अनकैप टाइप टाइप: Argument 1 को Foo :: passBar () में पास करना बार का उदाहरण होना चाहिए, NotBar का उदाहरण।