2010-08-17 20 views
40

मैं एक परियोजना पर काम कर रहा हूं, जिसमें मैं पुराने संस्करण के रूप में कुछ बहिष्कृत फ़ंक्शन का उपयोग कर रहा हूं। लेकिन पुराने संस्करण में उपयोग किए जाने पर मेरी स्क्रिप्ट को रोका नहीं जाना चाहिए। तो मैं जांच रहा हूं कि फ़ंक्शन मौजूद है या नहीं और यदि यह फिर से नहीं बना रहा है।PHP में is_callable और function_exists के बीच क्या अंतर है?

लेकिन function_exists और is_callable के बीच अंतर क्या है और उपयोगकर्ता के लिए कौन सा बेहतर है?

if(!is_callable('xyz')) { 

    function xyz() { 
    // code goes here 
    } 
} 

या

if(!function_exists('xyz')) { 

    function xyz() { 
    // code goes here 
    } 
} 

उत्तर

45

देखें समारोह is_callablecallbacks का केवल फ़ंक्शन नाम ही नहीं, बल्कि अन्य प्रकार स्वीकार करता है:

  • Foo::method
  • array("Foo", "method")
  • array($obj, "method")
  • क्लोजर और अन्य invokable वस्तुओं (PHP 5.3)

तो is_callable कुछ भी है कि आप call_user_func और परिवार के पास कर सकते हैं, जबकि function_exists केवल बताता है एक निश्चित समारोह मौजूद रहने पर (तरीकों नहीं, उस के लिए method_exists मानते और न ही बंद) स्वीकार करता है।

रखें एक और तरीका है, is_callablezend_is_callable के लिए एक आवरण है, जो छद्म प्रकार कॉलबैक साथ चर संभालती है, जबकि function_exists केवल कार्यों 'तालिका में एक hash table lookup करता है।

+0

धन्यवाद इससे बहुत मदद मिली .. –

2

एक समारोह Plop मौजूद है तो function_exists("Plop") सच वापस आ जाएगी।

function_exists

देखें एक चर प्रतिदेय है तो is_callable($var) सच वापस आ जाएगी।
अब इसका मतलब यह हो सकता है कि $var एक फ़ंक्शन नाम है।
लेकिन मैं ऑब्जेक्ट और विधि नाम कॉम्बो भी हो सकता था।

is_callable

8

जब किसी फ़ंक्शन (क्लास विधि नहीं) के साथ उपयोग किया जाता है तो function_exists को छोड़कर कोई अंतर नहीं होता है।

लेकिन जब आप कक्षा में विधियों के अस्तित्व की जांच करते हैं तो function_exists का उपयोग नहीं कर सकता है। आपको is_callable या method_exists का उपयोग करना होगा।

7

कक्षा संदर्भ में उपयोग किए जाने पर, is_callable कक्षा विधियों के लिए सत्य लौटाता है जो सार्वजनिक तरीकों से हैं, लेकिन सार्वजनिक प्रक्रियाएं - method_exists सभी विधियों - सार्वजनिक, संरक्षित और निजी के लिए सच होती है। function_exists क्लास संदर्भों के बाहर method_exists जैसा ही काम करता है।

0

एक और अलग:

आप एक वर्ग जो __call magic method का उपयोग करता है, तो is_callable($object, $method) हमेशा सच कुछ भी के लिए वापस आ जाएगी क्योंकि __call मूल रूप से हर विधि नाम स्वीकार करता है। और जैसा कि आप पहले से ही जानते हैं, method_exists इस के लिए झूठी वापसी करेगा यदि विधि कक्षा में परिभाषित नहीं है।

यदि आप केकपीएचपी Model कक्षा का उपयोग करते हैं तो यह विशेष रूप से परेशान होता है क्योंकि उन्होंने जादू प्रश्न प्रदान करने के लिए __call जादू विधि लागू की है, लेकिन यदि आप विधि को पूरी तरह परिभाषित करना चाहते हैं तो ठंडा नहीं है।

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