2010-08-17 74 views
40

我正在開發一個項目,在這個項目中,我使用了舊版本的一些棄用函數。但如果在舊版本中使用,不希望我的腳本停止。 所以我正在檢查函數是否存在,如果它沒有,然後再次創建它。PHP中is_callable和function_exists的區別究竟是什麼?

但是function_existsis_callable在php中有什麼區別,哪一個更適合用戶?

if(!is_callable('xyz')) { 

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

OR

if(!function_exists('xyz')) { 

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

回答

45

功能is_callable接受的callbacks不僅函數名,還有其它類型的:

  • Foo::method
  • array("Foo", "method")
  • array($obj, "method")
  • 封閉和其他可調用的對象( PHP 5.3)

所以is_callable接受什麼,你可以通過call_user_func和家庭,如果某個功能存在(而不是方法,請參閱method_exists對於這一點,也沒有關閉),而function_exists只告訴。

換句話說,is_callablezend_is_callable的包裝,它處理的變量與僞類型的回調,而function_exists只能在功能表做了hash table lookup

+0

非常感謝這幫助.. – 2010-08-17 06:41:50

2

如果一個函數Plop存在,那麼function_exists("Plop")將返回true。

function_exists

如果一個變量是可調用然後is_callable($var)將返回true。
現在這可能意味着$var是一個函數名稱。
但我也可以是一個對象和方法名稱組合。

is_callable

8

與函數(不是類方法)一起使用時,除function_exists稍快之外沒有區別。

但是當用於檢查某個類中存在的方法時,您不能使用使用function_exists。您必須使用is_callablemethod_exists

7

當在類上下文中使用時,is_callable對可訪問的類方法(例如公共方法)返回true,但method_exists對所有方法(public,protected和private)均返回true。 function_exists與外部類上下文中的method_exists做相同的事情。

0

還有一個不同:

如果您有使用__call magic method一個類時,is_callable($object, $method)將始終是任何返回true,因爲__call基本上接受每一個方法的名字。正如你可能已經知道的那樣,method_exists將返回false,如果該方法沒有在類中定義。

如果您使用CakePHP Model類,因爲它們實現了__call魔術方法來提供神奇的查詢,但是如果您希望方法被絕對定義,這並不酷。

相關問題