2016-04-03 8 views
6

के माध्यम से एक गैर स्थैतिक विधि का आह्वान करना मेरे पास found PHP दुभाषिया के कुछ अजीब (मेरे लिए) व्यवहार है और मुझे यकीन नहीं है कि यह उत्पादन में इसका उपयोग सुरक्षित है या नहीं।स्कोप रिज़ॉल्यूशन ऑपरेटर

जब हम Foo::bar() फोन और Foo वर्ग स्थिर bar विधि नहीं है, लेकिन यह गैर स्थिर bar विधि है, दुभाषिया गैर स्थिर barnull पर (हाँ, यह हास्यास्पद लगता है) को लागू करेगा। मुझे इस मामले में __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 के बराबर हो सकता है?

उत्तर

3

जबकि आपका उपरोक्त उदाहरण काम करता है, यह सबसे अच्छा अभ्यास नहीं है। यह पीएचपी प्रलेखन here में मान्यता प्राप्त है और है कहा गया है कि PHP में संस्करण 7 से पहले के संस्करणों, अगर E_STRICT त्रुटि की सूचना देना तो सक्षम किया गया है यह त्रुटि फेंकना होगा:

Strict Standards: Non-static method Foo::bar() should not be called statically in /Path/to/file.php on line 22 
इसके अतिरिक्त पीएचपी संस्करण 7 में और स्थिर कार्यों स्थिर बुला ऊपर

बहिष्कृत किया गया है और निष्पादन पर निम्न त्रुटि का कारण बन जाएगा:

Deprecated: Non-static method Foo::bar() should not be called statically in /Path/to/file.php on line 22 
+0

दस्तावेज़ों के संदर्भ के लिए धन्यवाद। मेरा मानना ​​है कि इस मामले में '__callStatic' को बुलाया जाना चाहिए। कक्षा में इस तरह के नाम के साथ स्थिर विधि नहीं है। और दस्तावेज़ बताते हैं कि '__callStatic() एक स्थैतिक संदर्भ में पहुंच योग्य तरीकों का आह्वान करते समय ट्रिगर किया जाता है। – Kolyunya

+0

@ कोलिअन्या एक दिलचस्प बात है जिसे मैंने एक स्थिर (या गैर-स्थैतिक' के भीतर परिवर्तनीय '$ this' असाइन/पुन: असाइन करने का प्रयास करते समय देखा) विधि यह है कि यह घातक त्रुटि 'घातक त्रुटि लौटाएगी: इसे $/path/to/file.php' में फिर से असाइन नहीं किया जा सकता है। तो, भले ही यह सबसे अच्छा अभ्यास नहीं है, मैं एक और मामला कल्पना नहीं कर सकता जहां 'जारीकर्ता ($ यह)' 'झूठा 'बराबर होगा। –

संबंधित मुद्दे