深刻精晓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 &$callable_name ]]
)

证实变量的剧情是还是不是作为函数调用。
那足以检查包蕴有效函数名的变量,可能三个数组,蕴含了不利编码的指标以及函数名。

参数:

name

要检查的回调函数。

syntax_only

比方设置为 TRUE,那些函数仅仅验证 name 大概是函数或方法。
它仅仅拒绝非字符,或然未包罗能用来回调函数的管用组织。有效的相应包蕴三个成分,第二个是贰个目的或许字符,首个因素是个字符。

callable_name

经受“可调用的名号”。上边的例证是“someClass::someMethod”。
注意,就算 someClass::SomeMethod()
的意思是可调用的静态方法,但例子的气象并不是那般的。

返回值:

如果 name 可调用则赶回 TRUE,不然重临 FALSE

参考文献: 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。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图