本篇文章主要介紹了PHP中的is_callable()和method_exists()函數,具有很高的學習價值,有興趣的朋友可以學習一下。
一、函式解析
#is_callable()
定義:
#(PHP 4 >= 4.0.6, PHP 5, PHP 7)
is_callable —偵測參數是否為合法的可呼叫結構
boolis_callable (callable$name
[,bool$syntax_only
= false [,string## = false [,
string#&$callable_name# ]] )
驗證變數的內容能否作為函數調用。這可以檢查包含有效函數名的變量,或者一個數組,包含了正確編碼的物件以及函數名。參數:
要檢查的回呼函數。
#如果設定為
TRUE,這個函數只是驗證
可能是函數或方法。它僅僅拒絕非字符,或未包含能用於回調函數的有效結構。有效的應該包含兩個元素,第一個是一個物件或字符,第二個元素是個字符。
#接受「可呼叫的名稱」。下面的例子是「someClass::someMethod」。注意,儘管 someClass::SomeMethod() 的意思是可呼叫的靜態方法,但例子的情況並不是這樣的。傳回值:
#如果
name可呼叫則回傳
TRUE,否則回傳
。參考:http://php.net/manual/zh/function.is-callable.php
#二、函數測試
測試一:
echo ''; $func = function ($a) { echo $a; }; $re = is_callable($func, true, $callable_name1); echo '
'; $re1 = is_callable($func, false, $callable_name2); //结果 bool(true) string(17) "Closure::__invoke" ------------------------------------- bool(true) string(17) "Closure::__invoke"
#對於匿名函數,傳入函數變數後,參數二syntax_onlytrue 和false
,列印結果是一樣的。
測試二:
function c_b($d) { echo $d; } $re = is_callable('c_b', false, $callable_name1); $re1 = is_callable('c_b', true, $callable_name2); var_dump($re); echo '
'; var_dump($re1); echo '
'; var_dump($callable_name1); echo '
'; var_dump($callable_name2); //结果 bool(true) ---------------- bool(true) ---------------- string(3) "c_b" ---------------- string(3) "c_b"
測試結果:對於一般函數,傳入函數名稱後,參數二syntax_only
#true 和false,列印結果是一樣的。
測試三:
class Person { public static function get($a) { echo $a; } protected function _set() { echo 1; } } $p = new Person(); $re = is_callable([$p, 'get'], false, $callable_name1); $re1 = is_callable([$p, 'get'], true, $callable_name2); var_dump($re); echo '
'; var_dump($re1); echo '
'; var_dump($callable_name1); echo '
'; var_dump($callable_name2); //结果 bool(true) ----------------- bool(true) ----------------- string(11) "Person::get" --------------------------- string(11) "Person::get"
##對於類別的方法,參數以陣列結構(類別物件或類別名稱方法名稱),參數二syntax_onlytrue 和false
,列印結果也是一樣的。
測試四:
$a = 'i am string'; $re = is_callable($a, false, $callable_name1); $re1 = is_callable($a, true, $callable_name2); var_dump($re); echo '
'; var_dump($re1); echo '
'; var_dump($callable_name1); echo '
'; var_dump($callable_name2); //结果 bool(false) ---------------- bool(true) ---------------- string(11) "i am string" ------------------------- string(11) "i am string"
对于传入的验证name,如果syntax_only设置为true,它验证传入name是否是字符串,是否含有非法字符,如果不含有,则返回true,它并不会验证name是否为合法调用结构。
测试五:
$re = is_callable(['Class', 'Method'], false, $callable_name1); $re1 = is_callable(['Class', 'Method'], true, $callable_name2); var_dump($re); echo '
'; var_dump($re1); echo '
'; var_dump($callable_name1); echo '
'; var_dump($callable_name2); //结果 bool(false) -------------- bool(true) -------------- string(13) "Class::Method" ----------------------------- string(13) "Class::Method"
测试结果:
对于传入的验证name,如果syntax_only设置为true,它只验证传入name是否是字符串,是否含有非法字符或是否为数组参数字符串1 + 字符串二,如果符合条件,则返回true,它并不会验证name是否为合法调用结构。否者返回false;
测试六:
class Person { public static function get($a) { echo $a; } protected function _set() { echo 1; } } $p = new Person(); $re = is_callable([$p, '_set'], false); var_dump($re); echo '
'; $re1 = method_exists($p, '_set'); var_dump($re1); //结果 bool(false) ------------ bool(true)
测试结果:
对于函数is_callable()来说,如果验证的类方法,访问修饰符为protected或private则返回false。
对于method_exists()来说,则不受访问修饰符的影响,只要类方法存在,则返回true。
三、总结、
1、is_callable()函数,可传入的name类型有:函数字符串,匿名函数变量,类或类对象和方法名称组成的数组。其函数第二参数,如果是true,则只验证name是否是字符串或则是类或字符串1(类对象)和字符串二(方法名称)组成的数组。而不验证name是否为合法调用结构。如果是false,则验证name是否为合法调用结构。
2、method_exists()函数,不受访问修饰符的影响,只要类方法存在,则返回true。函数is_callable()来说,如果验证的类方法,访问修饰符为protected或private则返回false。
相关教程:PHP视频教程
以上是PHP學習之深入理解is_callable()和method_exists()函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!