今天在YII架構事件進行中看到了is_callable函數,後來發現這個函數有與method_exists,function_exists有着使用的混淆的感覺,為了能更好的了解其功能,下面就來最個分析:(個人技術有限如果有誤還請指正)
驗證變量的内容是否能夠進行函數調用
bool is_callable ( callback $name [, bool $syntax_only = false [, string &$callable_name ]] )
參數:$name 可以接受數組(包含兩個元素,一個對象,一個方法名字元串)與字元串(函數名)。當然這隻是正确的可調用函數的參數。
$syntax_only 為真時隻驗證 $name 參數可能為函數或方法(隻判斷傳入的$name參數是不是簡單的字元串,如果是數組會判斷是不是隻包含兩個字元串或第一個是對象第二個是字元串)。如果為 false 會對$name判斷更加準确(如果是字元串會判斷函數是否可用或合法,當是數組時第一個參數必須是對象,第二個必須是字元串)。
$callable_name 傳回(引用處理)調用函數的基本形式,如果前面判斷失敗傳回$name參數(如果不是字元串會強制轉換為字元串)。
<a href="http://blog.51cto.com/attachment/201309/154445811.jpg" target="_blank"></a>
上面的結果是 bool(true) bool(false)
當$syntax_only為假 會判斷函數是否可用或合法,第一個 test 函數已經聲明,是以傳回true 第二個 test1 函數不存在,是以傳回false。
<a href="http://blog.51cto.com/attachment/201309/154534258.jpg" target="_blank"></a>
上面的結果是 bool(true) bool(true)
當$syntax_only為真 隻判斷$name參數是不是字元串并不關心函數是否可用或合法,當然如果$name非字元串那麼函數傳回false。
<a href="http://blog.51cto.com/attachment/201309/160455273.jpg" target="_blank"></a>
上面的結果是 bool(true) bool(true) bool(false) bool(false)
當$syntax_only為假 會判斷數組第一個參數是否為對象第二個參數是否為字元串并不關心是否為該對象的方法。
<a href="http://blog.51cto.com/attachment/201309/161009748.jpg" target="_blank"></a>
上面的結果是 bool(true) bool(true) bool(true) bool(false)
當$syntax_only為真 會判斷數組第一個參數是否為對象或字元串第二個參數是否為字元串并不關心是否為該對象的方法。
這個函數用于判斷某個變量是否為可調用的函數或方法,如果判斷的是數組隻會判斷第一個是不是為對象($syntax_only為false時)或為字元串($syntax_only為true時),第二個是不是字元串,并不能判斷是否有合法方法或是不是該對象的方法,如果$name是字元串會判斷函數是否存在或合法($syntax_only為false)或該參數是不是字元串($syntax_only為true時)。當is_callable('a::test')也是為真的,因為這個隻驗證參數内容是否為可調用函數的。最後的一個參數隻是提取調用函數的形式串,不論$name是否判斷通過都會修改該參數的值,實際應用不大,當$name判斷合法時,第三個參數為 " 類名::方法名 " 或 " 函數名 "如果失敗傳回的都是$name轉為字元串的内容。
檢查類的方法是否存在
bool method_exists ($object, $method_name)
參數:$object 對象或類名字元串
$method_name 方法名字元串(隻能為簡單類型的變量,否則報錯)
<a href="http://blog.51cto.com/attachment/201309/163545342.jpg" target="_blank"></a>
上面的結果是 bool(true) bool(true) bool(false)
隻要第一個參數是可用的類名字元串或對象,第二個參數為類或對象包含的方法名字元串即傳回真否則傳回假。
檢查指定的函數是否已經定義
bool function_exists ($function_name)
參數:$function_name 函數名字元串
<a href="http://blog.51cto.com/attachment/201309/165113424.jpg" target="_blank"></a>
隻要參數為可用的函數名傳回真否則傳回假。
到這裡可以看出來is_callable是可以代替function_exists但不能代替method_exists(但可以作前期判斷,否則程式易報錯不具健全性,主要是因為is_callable并不判斷方法是否為對象包含的)。
本文轉自 ttlxihuan 51CTO部落格,原文連結:http://blog.51cto.com/php2012web/1298815