अद्यतन : PHP 7.4 अब सहसंयोजक और विरोधाभासी का समर्थन करता है जो इस प्रश्न में उठाए गए प्रमुख मुद्दे को संबोधित करता है।
मैं PHP 7 में रिटर्न टाइप हिंटिंग का उपयोग करके किसी समस्या में चला गया हूं। मेरी समझ यह है कि संकेत देने का : self
अर्थ है कि आप एक कार्यान्वयन वर्ग के लिए खुद को वापस करने का इरादा रखते हैं। इसलिए मैंने : self
यह बताने के लिए अपने इंटरफेस में इस्तेमाल किया , लेकिन जब मैंने वास्तव में इंटरफ़ेस को लागू करने की कोशिश की तो मुझे संगतता त्रुटियां मिलीं।
निम्नलिखित समस्या का एक सरल प्रदर्शन है जिसे मैंने चलाया है:
interface iFoo
{
public function bar (string $baz) : self;
}
class Foo implements iFoo
{
public function bar (string $baz) : self
{
echo $baz . PHP_EOL;
return $this;
}
}
(new Foo ()) -> bar ("Fred")
-> bar ("Wilma")
-> bar ("Barney")
-> bar ("Betty");
अपेक्षित आउटपुट था:
फ्रेड विल्मा बार्नी बेट्टी
वास्तव में मुझे क्या मिलता है:
PHP घातक त्रुटि: फू की घोषणा :: बार (int $ baz): फू को iFoo :: bar (int $ baz) के साथ संगत होना चाहिए: लाइन 7 में test.php में iFoo
बात फू इफू के कार्यान्वयन की है, जहां तक मैं बता सकता हूं कि कार्यान्वयन दिए गए इंटरफ़ेस के साथ पूरी तरह से संगत होना चाहिए। मैं निश्चित रूप से इस मुद्दे को इंटरफ़ेस या कार्यान्वयन वर्ग (या दोनों) को बदलकर उपयोग करने के बजाय नाम से संकेत वापस करने के लिए ठीक कर सकता था self
, लेकिन मेरी समझ यह है कि शब्दार्थ self
का अर्थ है "उस वर्ग का उदाहरण वापस करें जिसे आपने विधि कहा है "। इसलिए इसे इंटरफ़ेस में बदलने का अर्थ सिद्धांत में होगा कि मैं किसी भी चीज को वापस कर सकता हूं जो कि इंटरफ़ेस को लागू करता है जब मेरा इरादा इनवॉइस किए गए उदाहरण के लिए होता है जो वापस आ जाएगा।
क्या यह PHP में एक निरीक्षण है या यह एक जानबूझकर डिजाइन निर्णय है? अगर यह पूर्व है तो क्या इसे PHP 7.1 में तय करने का कोई मौका है? यदि नहीं, तो रिटर्न हिंटिंग का सही तरीका क्या है कि आपका इंटरफ़ेस आपको उस उदाहरण को वापस करने की उम्मीद करता है जिसे आपने अभी-अभी चाइनिंग के लिए विधि कहा है?