2013-10-23 5 views
15

पर कॉल करने से पहले कक्षा में फ़ंक्शन मौजूद है या नहीं, निम्न कोड में मैं call_user_func() के साथ कक्षा को कॉल करता हूं।कॉल करें कि कॉल_user_func()

if(file_exists('controller/' . $this->controller . '.controller.php')) { 
    require('controller/' . $this->controller . '.controller.php'); 
    call_user_func(array($this->controller, $this->view)); 
} else { 
    echo 'error: controller not exists <br/>'. 'controller/' . $this->controller . '.controller.php'; 
} 

आइए कहें कि नियंत्रक के पास निम्न कोड है।

class test { 

    static function test_function() { 
     echo 'test'; 
    } 

} 

जब मैं call_user_func('test', 'test_function') पर कॉल करता हूं तो कोई समस्या नहीं है। लेकिन जब मैं एक ऐसा फ़ंक्शन कॉल करता हूं जो अस्तित्व में नहीं है तो यह काम नहीं करता है। अब मैं पहले जांचना चाहता हूं कि फ़ेस call_user_func पर कॉल करने से पहले, टी क्लास टेस्ट में फ़ंक्शन मौजूद है या नहीं।

क्या कोई ऐसा फ़ंक्शन है जो जांचता है कि कक्षा में कोई फ़ंक्शन मौजूद है या कोई अन्य तरीका है कि मैं इसे कैसे देख सकता हूं?

if (method_exists('ClassName','method_name')) 
call_user_func(etc...); 

या भी:

if (method_exists($class_instance,'method_name')) 
call_user_func(etc...); 
+7

[method_exists()] (http://php.net /manual/en/function.method-exists.php) –

+0

धन्यवाद @ मार्कबकर! –

+2

प्रत्येक मौजूदा विधि कॉल करने योग्य नहीं है -> [is_callable] (http://php.net/manual/en/function.is-callable.php) – a4c8b

उत्तर

39

आप शुरुआत के लिए method_exists खोज रहे हैं। लेकिन आप चेक करना चाहिए, भी गीला है या नहीं कॉल करने योग्य है। यह काम आते हुए नामित is_callable समारोह द्वारा किया जाता है:

if (method_exists($this->controller, $this->view) 
    && is_callable(array($this->controller, $this->view))) 
{ 
    call_user_func(
     array($this->controller, $this->view) 
    ); 
} 

लेकिन वह सिर्फ बातें की शुरुआत है। आपके स्निपेट में require कॉल स्पष्ट हैं, जो बताती है कि आप autoloader का उपयोग नहीं कर रहे हैं।
और क्या है: आप जो भी कर रहे हैं वह file_exists जांचें, भले ही कक्षा पहले ही लोड हो गई हो। यदि आपका कोड $this->controller के लिए समान मानों के साथ दो बार निष्पादित हो जाता है, तो आपका कोड एक घातक त्रुटि उत्पन्न करेगा।
शुरू बहुत कम में यह द्वारा फिक्सिंग, बदलते अपने requirerequire_once करने के लिए ...

+0

टीआईएल 'is_callable' के बारे में, धन्यवाद! –

+0

यदि आप 'is_callable() 'को कॉल कर रहे हैं तो आपको' method_exists() 'को कॉल करने की आवश्यकता है? – MrWhite

+2

@ w3d: 'is_callable', सैद्धांतिक रूप से 'सत्य' वापस कर सकता है भले ही आप एक विधि (संपत्तियों को निर्दिष्ट बंद) नहीं बुला रहे हों। दोनों चेक करना शायद एक टैड पागल है, लेकिन यह सबसे सुरक्षित तरीका है। इसके अलावा, मैंने पिछली बार जांच की, 'method_exists' ने बेहतर प्रदर्शन किया, इसलिए यदि वह झूठा लौटाता है, तो 'is_callable' नहीं कहा जाएगा (माइक्रो-ऑप्टिमाइज़ेशन, मुझे पता है, लेकिन फिर भी ...)। यह कहना नहीं है कि आपके पास कोई मुद्दा नहीं है, लेकिन मुझे लगता है कि दोनों कार्य इस संदर्भ में उल्लेखनीय हैं ... –

9

आप PHP समारोह method_exists() उपयोग कर सकते हैं। आपके उदाहरण के लिए:

if(file_exists('controller/' . $this->controller . '.controller.php') && 
    method_exists($this->controller,$this->view)) { 

    require('controller/' . $this->controller . '.controller.php'); 
    call_user_func(array($this->controller, $this->view)); 

} else { 
    echo 'error: controller or function not exists <br/>'. 'controller/' . $this->controller . '.controller.php'; 
} 
+0

बढ़िया यह आपने इसे बहुत सरल समझने के लिए बनाया है। –

0

उपयोग method_exists($this->controller, $this->view)

+1

हालांकि आपको 'method_exists() '_after_ को कॉल करने की आवश्यकता होगी, आपने कक्षा फ़ाइल शामिल की है। – MrWhite

3

पीएचपी 5.3 से आप उपयोग कर सकते हैं

if(method_exists($this, $model)) 
    return forward_static_call([$this, $model],$extra, $parameter); 
संबंधित मुद्दे