2015-11-26 10 views
6

में विधि मौजूद है, तो method_exists() को यह देखने के लिए एक ऑब्जेक्ट की आवश्यकता है कि कोई विधि मौजूद है या नहीं। लेकिन मैं जानना चाहता हूं कि एक ही कक्षा के भीतर से कोई विधि मौजूद है या नहीं।जांचें कि क्या एक ही कक्षा

मेरे पास एक तरीका है जो कुछ जानकारी संसाधित करता है और एक क्रिया प्राप्त कर सकता है, जो उस जानकारी को आगे संसाधित करने के लिए एक विधि चलाता है। मैं यह जांचना चाहता हूं कि यह कॉल करने से पहले विधि मौजूद है या नहीं। मैं इसे कैसे प्राप्त कर सकता हूं?

उदाहरण:

class Foo{ 
    public function bar($info, $action = null){ 
     //Process Info 
     $this->$action(); 
    } 
} 
+0

नीचे दिए गए उत्तर ठीक हैं, बस एक अतिरिक्त टिप्पणी: क्या आपने खुद से पूछा है कि आपको यह पता लगाने की आवश्यकता है कि विधि मौजूद है या नहीं? यह स्थिति _may_ उत्पन्न होती है यदि आपके पास मूल वर्ग से प्राप्त विधि है या यदि आप इस बारे में अनिश्चित हैं कि वर्तमान वर्ग को क्या प्राप्त होता है। दोनों मामलों को एक इंटरफेस या एक अमूर्त विधि परिभाषा का उपयोग करके निपटाया जा सकता है। जो अधिक पारदर्शी है और समय को संकलित करने के लिए रनटाइम से त्रुटि को स्थानांतरित करता है, इस प्रकार बेहतर है। – arkascha

+0

क्योंकि मेरे पास कुछ अन्य विधियां हैं जो सार्वजनिक हैं और उस प्रक्रिया को आगे संसाधित करती हैं और संसाधित डेटा लौटाती हैं, पहली विधि वापस नहीं आती है, क्योंकि यह डेटा प्राप्त कर सकता है जिसे अभी संसाधित किया जाना चाहिए और उसे कुछ भी वापस करने की आवश्यकता नहीं है। लेकिन मैंने सोचा कि यदि आवश्यक हो तो दूसरी विधि को फ़िसर्ट विधि से कॉल करने के लिए समय बचाने वाला होगा, लेकिन फिर भी उन्हें अलग-अलग कॉल करने में सक्षम होना चाहिए। – Rafael

+0

लेकिन कक्षा के अंदर ही, यदि कोई विधि मौजूद है तो यह अस्पष्ट क्यों होना चाहिए? मेरा मतलब है कि या तो यह कक्षा में घोषित/लागू किया गया है या यह नहीं है। रनटाइम पर यह कैसे और क्यों बदलना चाहिए? मैं कहूंगा कि विधि वास्तव में मौजूद है या नहीं। – arkascha

उत्तर

21

आप कुछ इस तरह कर सकते हैं:

class A{ 
    public function foo(){ 
     echo "foo"; 
    } 

    public function bar(){ 
     if(method_exists($this, 'foo')){ 
      echo "method exists"; 
     }else{ 
      echo "method does not exist"; 
     } 
    } 
} 

$obj = new A; 
$obj->bar(); 
2

method_exists() या तो एक वर्ग के नाम स्वीकार करता है या एक पैरामीटर के रूप उदाहरण आपत्ति है। तो तुम ¶

वस्तु एक वस्तु उदाहरण या एक वर्ग के नाम के खिलाफ $this

http://php.net/manual/en/function.method-exists.php

पैरामीटर की जांच कर सकता

पद्वति विधि नाम

+0

मुझे लगता है कि आपने मुझे जो कहा है उसका समर्थन करने के लिए मैनुअल के लिए एक लिंक दिया है, लेकिन मैनुअल में यह कहता है कि इसे एक ऑब्जेक्ट की आवश्यकता है। – Rafael

+0

मैं देखता हूं कि मुझे अभी भी बहुत कुछ सीखना है xD – Calimero

+0

ओउ, (जमीन में चेहरा), क्षमा करें = पी – Rafael

7

का उपयोग method_exists सही है। लेकिन यदि आप "इंटरफेस पृथक्करण सिद्धांत" के अनुरूप करना चाहते हैं, तो आप ऐसा की तरह, के खिलाफ आत्मनिरीक्षण प्रदर्शन करने के लिए एक अंतरफलक पैदा करेगा:

class A 
{ 
    public function doA() 
    { 
     if ($this instanceof X) { 
      $this->doX(); 
     } 

     // statement 
    } 
} 

interface X 
{ 
    public function doX(); 
} 

class B extends A implements X 
{ 
    public function doX() 
    { 
     // statement 
    } 
} 

$a = new A(); 
$a->doA(); 
// Does A::doA() only 

$b = new B(); 
$b->doA(); 
// Does B::doX(), then remainder of A::doA() 
+1

डब्ल्यूटीएफ ????? के लिए ऊपर दिए गए दिलचस्प भाग को हाइलाइट करते हुए मैंने कोशिश की है कि आप क्या करेंगे ... – Rafael

+0

@ राफेल क्या आप ओओपी से प्यार नहीं करते हैं। – Flosculus

+2

मैं शुरू कर रहा था, लेकिन आपने इसे @ फ्लोस्कुलस – Rafael

1

मेरी राय में सबसे अच्छा तरीका है __call जादू विधि का उपयोग करने के लिए है।

public function __call($name, $arguments) 
{ 
    throw new Exception("Method {$name} is not supported."); 
} 

हां, आप method_exists ($ यह ...) का उपयोग कर सकते हैं लेकिन यह आंतरिक PHP तरीका है।

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