本篇文章主要介紹了PHP中的is_callable()和method_exists()函數,具有很高的學習價值,有興趣的朋友可以學習一下。
一、函式解析
#is_callable()
定義:
#(PHP 4 >= 4.0.6, PHP 5, PHP 7)
is_callable — 偵測參數是否為合法的可呼叫結構
bool is_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 '<pre >';
$func = function ($a)
{
echo $a;
};
$re = is_callable($func, true, $callable_name1);
echo '<hr />';
$re1 = is_callable($func, false, $callable_name2);
//结果
bool(true)
string(17) "Closure::__invoke"
-------------------------------------
bool(true)
string(17) "Closure::__invoke"
#對於匿名函數,傳入函數變數後,參數二syntax_only true 和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 '<hr />'; var_dump($re1); echo '<hr />'; var_dump($callable_name1); echo '<hr />'; 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 '<hr />';
var_dump($re1);
echo '<hr />';
var_dump($callable_name1);
echo '<hr />';
var_dump($callable_name2);
//结果
bool(true)
-----------------
bool(true)
-----------------
string(11) "Person::get"
---------------------------
string(11) "Person::get"
##對於類別的方法,參數以陣列結構(類別物件或類別名稱方法名稱),參數二syntax_only true 和false
,列印結果也是一樣的。
測試四:$a = 'i am string';
$re = is_callable($a, false, $callable_name1);
$re1 = is_callable($a, true, $callable_name2);
var_dump($re);
echo '<hr />';
var_dump($re1);
echo '<hr />';
var_dump($callable_name1);
echo '<hr />';
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 '<hr />'; var_dump($re1); echo '<hr />'; var_dump($callable_name1); echo '<hr />'; 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 '<hr />'; $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中文網其他相關文章!