深刻明白

一如既往、函数解析

2017/03/09
直白以来,对于OpenStack都是同样栽浅层的领会。没有深切之失了解这个内容,我得在斯层次上重新进一步,不必然假诺去念源码,最起码,我得拿各类地点的机制都亮的不得了通晓。

is_callable()


定义:

2017/03/10
为设置devstack,也是荒废了足足的时刻。也是合了。
2017/03/23

 

Compute uses a messaging-based, shared nothing architecture. All major 
components exist on multiple servers, including the compute, volume, 
and network controllers,and the Object Storage or Image service. 
The state of the entire system is stored in a database. 
The cloud controller communicates with 
the internal object store using HTTP, but it communicates with the scheduler, 
network controller, and volume controller using Advanced Message Queuing 
Protocol (AMQP). To avoid blocking a component while waiting for a response, 
Compute uses asynchronous calls, with a callback that is triggered when a 
response is received.

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