के माध्यम से एक गैर स्थैतिक विधि का आह्वान करना मेरे पास found PHP दुभाषिया के कुछ अजीब (मेरे लिए) व्यवहार है और मुझे यकीन नहीं है कि यह उत्पादन में इसका उपयोग सुरक्षित है या नहीं।स्कोप रिज़ॉल्यूशन ऑपरेटर
जब हम Foo::bar()
फोन और Foo
वर्ग स्थिर bar
विधि नहीं है, लेकिन यह गैर स्थिर bar
विधि है, दुभाषिया गैर स्थिर bar
null
पर (हाँ, यह हास्यास्पद लगता है) को लागू करेगा। मुझे इस मामले में __callStatic
आने की उम्मीद है। लेकिन ऐसा नहीं है कि किसी कारण से क्या हो रहा है।
मैं तो इस व्यवहार के लिए एक आसान उपयोग मिल गया है:
class Foo
{
public function bar(){
if (isset($this)) {
$this->nonStaticBar();
} else {
static::staticBar();
}
}
private function nonStaticBar() {
echo "Non-static\n";
}
private static function staticBar() {
echo "Static\n";
}
}
(new Foo())->bar(); // Output: "Non-static"
Foo::bar(); // Output: "Static"
हाँ मैं जानता हूँ कि, कि इस दृष्टिकोण नहीं है: इस तरह एक ही नाम के साथ स्थिर और गैर स्थिर तरीकों के साथ वर्ग प्रदान करने के लिए सुरुचिपूर्ण और स्थापत्य रूप से गलत। सवाल यह है कि अगर यह "फीचर" का उपयोग करने के लिए सुरक्षित (मानक-अनुरूप) है या नहीं। क्या कोई अन्य मामले हैं जब isset($this)
false
के बराबर हो सकता है?
दस्तावेज़ों के संदर्भ के लिए धन्यवाद। मेरा मानना है कि इस मामले में '__callStatic' को बुलाया जाना चाहिए। कक्षा में इस तरह के नाम के साथ स्थिर विधि नहीं है। और दस्तावेज़ बताते हैं कि '__callStatic() एक स्थैतिक संदर्भ में पहुंच योग्य तरीकों का आह्वान करते समय ट्रिगर किया जाता है। – Kolyunya
@ कोलिअन्या एक दिलचस्प बात है जिसे मैंने एक स्थिर (या गैर-स्थैतिक' के भीतर परिवर्तनीय '$ this' असाइन/पुन: असाइन करने का प्रयास करते समय देखा) विधि यह है कि यह घातक त्रुटि 'घातक त्रुटि लौटाएगी: इसे $/path/to/file.php' में फिर से असाइन नहीं किया जा सकता है। तो, भले ही यह सबसे अच्छा अभ्यास नहीं है, मैं एक और मामला कल्पना नहीं कर सकता जहां 'जारीकर्ता ($ यह)' 'झूठा 'बराबर होगा। –