深远领悟is_callable和method_exists

壹 、函数解析

深入了然UMuranoL,长远通晓总计机连串

U君越I(Universal Resource Identifier)经常由三片段构成:
①访问能源的命名机制; ②存放能源的主机名; ③能源自个儿
的称呼,由路径表示。
如上面的U景逸SUVI:http://www.webmonkey.com.cn/html/html40/

UWranglerL(Uniform Resource
Locator),通俗的来讲,UTucsonL是Internet上讲述消息能源的字符串,重要用在各个WWW客户端和服务器上,能够用联合的格式来描述新闻能源

UPAJEROL格式的三片段:      �第叁部分是协商(或称为服务措施)。
             �第2片段是存有该财富的主机
IP地址(有时也席卷端口号
           �第2局地是主机资源的具体地址, 如目录和文书名等

第③局地和第①局地用“ ://” 符号隔开,第一片段和第①部分用“ /”
符号隔开。第三有些和第三有些是不行缺失的,第一有的有时可以大致。

例子:1.http协议的URl示例 : http://www.peopledaily.com.cn/channel/welcome.htm
其总括机域名为
www.peopledaily.com.cn。一流文本文件(文件类型为.html)是在目录/channel下的
welcome.htm。那是神州人民早报的一台总计机。
    2.文本格局的URL

    用 UHighlanderL 表示文件时, 服务器格局用 file 表示, 后边要有主机 IP
地址、
文件的存取路径(即目录)和文件名等新闻。有时可以省略目录和文书名,但“ /”
符号无法容易。例:
file://ftp.yoyodyne.com/pub/files/foobar.txt。下面这些 UCRUISERL
代表存放在主机 ftp.yoyodyne.com 上的
pub/files/目录下的一个文件,文件名是 foobar.txt。例:
file://ftp.yoyodyne.com/pub  代表主机ftp.yoyodyne.com 上的目录/pub。例:
file://ftp.yoyodyne.com/ 代表主机ftp.yoyodyne.com 的根目录。

http://www.bkjia.com/Javascript/1157490.htmlwww.bkjia.comtruehttp://www.bkjia.com/Javascript/1157490.htmlTechArticle深入理解URL,深入理解计算机系统 U冠道I(Universal
Resource Identifier)寻常由三有的构成: ①造访能源的命名机制;
②存放财富的主机名; ③资…

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 ]]
)

证实变量的故事情节是还是不是作为函数调用。
这足以检查包蕴有效函数名的变量,只怕2个数组,包含了未可厚非编码的目标以及函数名。

参数:

name

要检查的回调函数。

syntax_only

一旦设置为 TRUE,那么些函数仅仅验证 name 只怕是函数或艺术。
它仅仅拒绝非字符,或然未包蕴能用来回调函数的一蹴而就社团。有效的应当包罗多个因素,第①个是3个对象恐怕字符,第③个成分是个字符。

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地图