यदि कोई चर है, तो यह निर्धारित करने के लिए php is_function () है


89

मैं php में अनाम फ़ंक्शंस के बारे में पढ़ने के लिए बहुत उत्साहित था , जो आपको एक चर घोषित करता है जो कि आसान है जो कि आप create_nunction के साथ कर सकते हैं । अब मैं सोच रहा हूं कि क्या मेरे पास एक फ़ंक्शन है जिसे एक चर पारित किया गया है, तो मैं यह कैसे निर्धारित कर सकता हूं कि यह एक फ़ंक्शन है? कोई is_function () फ़ंक्शन अभी तक नहीं है, और जब मैं एक चर का एक var_dump करता हूं जो एक फ़ंक्शन है ::

$func = function(){
    echo 'asdf';
};
var_dump($func);

मैंने इसे प्राप्त किया:

object(Closure)#8 (0) { } 

अगर यह एक फ़ंक्शन है, तो कैसे जांचना है पर कोई विचार?

जवाबों:


141

is_callableयह निर्धारित करने के लिए उपयोग करें कि क्या दिया गया चर एक फ़ंक्शन है। उदाहरण के लिए:

$func = function()
{  
    echo 'asdf';  
};

if( is_callable( $func ) )
{
    // Will be true.
}

10
is_callable () बहुत काम करेगा चाहे आप किसी अनाम फ़ंक्शन, स्ट्रिंग के रूप में कोई फ़ंक्शन नाम या मान्य PHP कॉलबैक सरणी में पास कर रहे हों। यदि आप विशेष रूप से केवल अनाम फ़ंक्शंस की जांच करना चाहते हैं, तो आप कुछ ऐसा चाहते हैं जैसे कि गम्बो ने कहा: सुनिश्चित करें कि पैरामीटर एक ऑब्जेक्ट है, और सुनिश्चित करें कि यह एक इंस्टोफ़ क्लोजर है।
लेन

2
क्या होगा अगर मैं जाँघ की जाँच करना चाहता हूँ यह एक कॉल या एक स्ट्रिंग है और उनके लिए अलग-अलग काम करते हैं। मैं नहीं चाहता कि कोई स्ट्रिंग मान गलती से कॉलबैक के रूप में लिया जाए।
घूमर

3
@ जर्मन पहले चेक करें अगर is_string ($ func) है तो is_callable ($ func) के साथ दूसरा चेक
Heroselohim

4
ऊपर का कोड स्निपेट मुझे मुश्किल में डाल गया। मैंने "दिनांक" नामक एक स्ट्रिंग का इरादा किया था और फिर इसे एक क्लोजर के रूप में संभाला और निष्पादित किया गया। सही तरीका यह है कि (($ चर इंस्टोफ़ क्लोज़र) && is_callable ($ चर)) {...}
बेसिल मूसा

1
क्यों बंद करने और कॉल करने का उदाहरण है। जब एक बंद कॉल करने योग्य नहीं है? अगर एक समय था, तो आश्चर्य नहीं होगा, लेकिन मैं उत्सुक हूं कि हमें दोनों चेक की आवश्यकता क्यों है।
जोएल एम

34

आप function_existsजाँच कर सकते हैं कि दिए गए नाम के साथ कोई फ़ंक्शन है। और अनाम कार्यों के साथ इसे संयोजित करने के लिए, इसे आज़माएँ:

function is_function($f) {
    return (is_string($f) && function_exists($f)) || (is_object($f) && ($f instanceof Closure));
}

इसके लिए धन्यवाद! मेरा ऐप उपयोगकर्ताओं को अपने स्वयं के हैशिंग फ़ंक्शन को निर्दिष्ट करने की अनुमति देता है, या वैकल्पिक रूप से हैश () के लिए एक तर्क प्रदान करता है। लेकिन वैध हैशिंग एल्गोरिदम में से कुछ भी PHP बिल्डिंस हैं, और इसलिए कॉल करने योग्य ('md5', 'sha1' उदाहरण के लिए)। is_object()और instanceof Closureइस के लिए जाँच करने के लिए एक बहुत अधिक मजबूत तरीका है!
njbair

Is_string और function_exists कॉल्स निकालें और यह वह फ़ंक्शन है जिसका उपयोग आप लैम्बडा फ़ंक्शन का पता लगाने के लिए करना चाहते हैं। धन्यवाद!
जैक

30

यदि आप केवल यह जांचना चाहते हैं कि चर एक अनाम फ़ंक्शन है, और कॉल करने योग्य स्ट्रिंग या सरणी नहीं है, तो उपयोग करें instanceof

$func = function()
{  
    echo 'asdf';  
};

if($func instanceof Closure)
{
    // Will be true.
}

बेनामी फ़ंक्शंस (PHP 5.3 में जोड़े गए प्रकार के) हमेशा Closureवर्ग के उदाहरण हैं , और कक्षा का प्रत्येक उदाहरण Closureएक अनाम फ़ंक्शन है।

PHP में एक और प्रकार की चीज है जिसे यकीनन एक फ़ंक्शन माना जा सकता है, और वह वस्तुएं हैं जो __invokeजादू पद्धति को लागू करती हैं । यदि आप उन्हें शामिल करना चाहते हैं (जबकि अभी भी तार और सरणियों को छोड़कर), का उपयोग करें method_exists($func, '__invoke')। इसमें अभी भी क्लोजर शामिल होंगे, क्योंकि क्लोजर __invokeस्थिरता के लिए लागू होते हैं ।


8
यह विशेष रूप से सहायक है, क्योंकि is_callable()एक स्ट्रिंग या सरणी के आधार पर कॉल करने के लिए एक विधि खोजने की कोशिश की जाएगी, जो ऑटोलैड कक्षाएं हो सकती है और वह व्यवहार नहीं हो सकता है जिसकी आप अपेक्षा / आवश्यकता करते हैं।
spikyjt

2
function is_function($f) {
    return is_callable($f) && !is_string($f);
}

भविष्य में, PHP ऑब्जेक्ट से कॉल करने योग्य के लिए gettype () को बदल सकती है, जैसा कि अन्य भाषाएँ पहले से करती हैं। तो, यह उत्तर शायद जाने का सबसे अच्छा तरीका है। लेकिन इसे इस रूप में अनुकूलित किया जा सकता है: वापसी! Is_string ($ f) &&! Is_array ($ f) && is_callable ($ f))।
अलेक्जेंड्रे टी।

0

Php में वैध कॉलबेल फ़ंक्शंस, फ़ंक्शंस के नाम (स्ट्रिंग्स) और फॉर्म के सरणियाँ ['className', 'staticMethod']या [$object, 'method'], इसलिए केवल फ़ंक्शंस का पता लगाने के लिए स्ट्रिंग्स और सरणियों को बाहर करने की आवश्यकता होती है:

function isFunction($callable) {
    return $callable && !is_string($callable) && !is_array($callable) && is_callable($callable);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.