1. 程式人生 > 實用技巧 >Mac 中安裝 nvm: 切換Node 不同版本

Mac 中安裝 nvm: 切換Node 不同版本

今天在YII框架事件處理中看到了is_callable函式,後來發現這個函式有與method_exists,function_exists有著使用的混淆的感覺,為了能更好的理解其功能,下面就來最個分析:(個人技術有限如果有誤還請指正


is_callable

驗證變數的內容是否能夠進行函式呼叫

bool is_callable ( callback $name [, bool $syntax_only = false [, string &$callable_name ]] )


引數:$name 可以接受陣列(包含兩個元素,一個物件,一個方法名字串)與字串(函式名)。當然這只是正確的可呼叫函式的引數。

$syntax_only 為真時只驗證 $name 引數可能為函式或方法(只判斷傳入的$name引數是不是簡單的字串,如果是陣列會判斷是不是隻包含兩個字串或第一個是物件第二個是字串)。如果為 false 會對$name判斷更加準確(如果是字串會判斷函式是否可用或合法,當是陣列時第一個引數必須是物件,第二個必須是字串)。

$callable_name 返回(引用處理)呼叫函式的基本形式,如果前面判斷失敗返回$name引數(如果不是字串會強制轉換為字串)。

154445811.jpg

上面的結果是 bool(true) bool(false)

當$syntax_only為假 會判斷函式是否可用或合法,第一個 test 函式已經宣告,所以返回true 第二個 test1 函式不存在,所以返回false。

154534258.jpg

上面的結果是 bool(true) bool(true)

當$syntax_only為真 只判斷$name引數是不是字串並不關心函式是否可用或合法,當然如果$name非字串那麼函式返回false。

160455273.jpg

上面的結果是 bool(true) bool(true) bool(false) bool(false)

當$syntax_only為假 會判斷陣列第一個引數是否為物件第二個引數是否為字串並不關心是否為該物件的方法。

161009748.jpg

上面的結果是 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轉為字串的內容。


method_exists

檢查類的方法是否存在

bool method_exists ($object, $method_name)

引數:$object 物件或類名字串

$method_name 方法名字串(只能為簡單型別的變數,否則報錯)

163545342.jpg

上面的結果是 bool(true) bool(true) bool(false)

只要第一個引數是可用的類名字串或物件,第二個引數為類或物件包含的方法名字串即返回真否則返回假。


function_exists

檢查指定的函式是否已經定義

bool function_exists ($function_name)

引數:$function_name 函式名字串

165113424.jpg

上面的結果是 bool(true) bool(false)

只要引數為可用的函式名返回真否則返回假。



到這裡可以看出來is_callable是可以代替function_exists但不能代替method_exists(但可以作前期判斷,否則程式易報錯不具健全性,主要是因為is_callable並不判斷方法是否為物件包含的)。

轉載於:https://blog.51cto.com/php2012web/1298815