2010-05-14 106 views
70

我很興奮地閱讀關於anonymous functions在PHP中,它讓你聲明一個變量,功能比你可以做的更容易create_function。現在我想知道如果我有一個函數傳遞一個變量,我該如何檢查它以確定它是否是一個函數?沒有is_function()函數的是,當我做一個變量的的var_dump這是一個功能::php is_function(),以確定一個變量是否是一個函數

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

我得到這個:

object(Closure)#8 (0) { } 

如何檢查,如果這有什麼想法是一個函數?

回答

109

使用is_callable確定給定的變量是否是一個函數。例如:

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

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

無論您傳入匿名函數,函數名稱作爲字符串還是有效的PHP回調數組,is_callable()都會很好。如果你特別想要檢查匿名函數,那麼你會想要類似Gumbo所說的東西:確保參數是一個對象,並確保它是一個實例閉包。 – Lane 2011-11-03 16:21:15

+1

如果我想檢查它是犢牛還是繩子,併爲它們做不同的事情,該怎麼辦?我不希望字符串值被意外地作爲回調。 – Gherman 2014-08-19 11:26:01

+2

@German首先檢查is_string($ func),然後再用is_callable($ func)檢查 – Heroselohim 2015-01-08 21:48:53

29

您可以使用function_exists來檢查是否有給定名稱的函數。而要結合起來,與匿名函數,試試這個:

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

感謝您的支持!我的應用程序允許用戶指定自己的散列函數,或者爲hash()提供參數。但是一些有效的哈希算法也是PHP內建的,因此可以調用(例如'md5','sha1')。 'is_object()'和'instanceof Closure'是一個更強大的方法來檢查這個! – njbair 2012-12-22 18:50:31

+0

刪除is_string和function_exists調用,這是您想用來檢測lambda函數的函數。謝謝! – jack 2013-09-10 13:22:00

17

如果你只是想檢查變量是否是一個匿名函數,而不是一個可調用的字符串或數組,使用instanceof。 (在PHP 5.3中添加的那種)

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

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

匿名函數總是Closure類的實例,以及Closure類的每個實例是一個匿名函數。

在PHP中還有另外一種類型的東西可以被認爲是一種功能,那就是實現了神奇方法的對象。如果你想包括那些(但仍然排除字符串和數組),請使用method_exists($func, '__invoke')。這仍將包括關閉,因爲爲了一致性,關閉實施__invoke

+4

這是特別有用的,因爲'is_callable()'會嘗試根據傳遞的字符串或數組尋找一個方法來調用,這可能會自動加載類,並且可能不是您期望/需要的行爲。 – spikyjt 2015-02-16 10:12:58

0
function is_function($f) { 
    return is_callable($f) && !is_string($f); 
} 
相關問題