Javascript权威指南,深远通晓is_callable和method_exists

壹 、函数解析

is_callable

php函数method_exists()
与is_callable()的分别在哪?在php面相对象设计进度中,往往大家要求在调用某3个主意是还是不是属于某3个类的时候做出判断,常用的措施有
method_exists()和is_Javascript权威指南,深远通晓is_callable和method_exists。callable(),相比较之下,is_callable()函数要高级部分,它承受字符串变量方式的法门名作为
第1个参数,若是类措施存在并且可以调用,则赶回true。借使要检测类中的方法是还是不是能被调用,可以给函数传递八个数组而不是类的形式名作为参数。数组必须带有对象或类名,以将其用作它的第三个元素,要反省的办法名则作为第2个要素。如果该方法在类中留存,函数再次来到true。
代码示例:

第壹章 类型、值和变量

is_callable()

(PHP 4 >= 4.0.6, PHP 5)

复制代码 代码如下:

3.2 文本

定义:

is_callable— 验证变量的始末是还是不是可以举行函数调用

if ( is_callable( array( $obj, $method ) ) )
{
/*要操作的代码段*/
}

3.2.1 字符串直接量

提议:在javascript中使用单引号表示字符串,在HTML中应用双引号表示字符串;

 

Description(描述)

is_callable()可以加收其它3个参数:三个布尔值,假若将该参数设置为true,函数仅仅检查给定的法门或函数名称的语法是不是正确,而不检讨其是不是真正存在。method_exists()函数的参数为一个对象(或类名)和一个措施名,若是给定措施在对象的类中留存,则赶回true
代码示例:

3.2.2 转义字符

\n 换行符
\r 回车符

(PHP 4 >= 4.0.6, PHP 5, PHP 7)

boolis_callable(callback$name[,bool$syntax_only=
false[,string&$callable_name]] )

复制代码 代码如下:

3.3 布尔值

undefined null 0 -0 NaN “” 会转化为false,其余值转化为true

 

表达变量的始末是或不是可以进行函数调用。可以用来检查3个变量是还是不是带有三个管用的函数名称,或然一个分包经过合适编码的函数和分子函数名的数组。

if ( method_exists( $obj, $method ) )
{
/*要操作的代码段*/
}

3.6 包装对象

字符串通过new
String()构造函数创立一个暂时对象,那个目的继承了字符串的方法,并被用来处理属性的引用,一旦引用为止,那一个目的活动销毁。
数字和布尔值也享有各自的法门 Number() Boolean()
null和undefined没有包装对象

is_callable — 检测参数是还是不是为官方的可调用结构

Parameters(参数)

php函数method_exists()与is_callable()的不同在于在php5中,3个艺术存在并不意味着它就足以被调用。对于
private,protected和public类型的章程,method_exits()会返回true,但是is_callable()会检讨存在其是还是不是足以访问,假若是private,protected类型的,它会回去false。

3.10 变量功能域

在函数体内,局地变量的预先级高于同名的全局变量

bool is_callable ( callable $name [, bool $syntax_only = false [, string &$callable_name ]]
)

name

你恐怕感兴趣的篇章:

  • PHP
    Callable强制钦点回调类型的方法
  • 详解php 使用Callable
    Closure强制钦赐回调类型

第5章 语句

适度从紧形式和非严俊格局之间的区分:

  • 凶暴格局中明令禁止采纳with语句
  • 严刻情势中保有变量要先表明,否则将会抛出三个引用错误非凡
  • 残忍情势用调用的函数中的3个this值是undefined,在非严刻情势中,this值总是全局变量。这可以用来判断是或不是帮忙严刻形式var hasStrictMode = (fuction(){"use strict";return this === undefined}())
  • 严刻形式中,当通过call()或apply()来调用函数时,其中的this就是call()或apply()传入的率先个参数
  • 严加方式中,给只读属性和给不可增加的靶子成立新成员都将抛出二个种类错误
  • 严苛形式中,传入eval()的代码不可以再调用程序所在的上下文中声称变量或概念函数
  • 严峻方式中,函数里的arguments对象具备传入函数值的静态副本,在非严谨形式中,arguments里的数组成分和函数参数都针对同二个值的引用
  • 适度从紧情势中试图删除2个不足配置的个性将抛出贰个种类错误
  • 严谨格局中,在3个对象间接量中定义四个或四个同名属性将发出1个语法错误
  • 适度从紧形式中,函数申明中设有七个或七个同名参数将发生三个语法错误
  • 严谨情势中,不允许使用八进制直接量
  • 严加情势中,arguments,caller和arguments.callee都将抛出一个档次错误。

注明变量的情节是还是不是作为函数调用。
这可以检查包蕴有效函数名的变量,可能3个数组,包罗了不利编码的靶子以及函数名。

既可以是3个字符串类型的函数名称,也得以是一个对象和分子函数名的三结合数组,比如:array($SomeOject,
‘MethodName’)

第6章 对象

参数:

syntax_only

6.1 创设对象

name

假诺设置为true,那么只是表达name是多个函数恐怕措施,函数仅仅会拒绝不是字符串,亦只怕结构不合规的数组作为回调函数。合法社团是指三个带有七个成员的数组,第1个是目标恐怕字符串,第1个是一个字符串。

6.1.3 原型

object.prototype没有原型对象,它不继续任何性质,全数内置函数都持续自它

要检查的回调函数。

callable_name

6.1.4 Object.create()

运用Object.create()成立1个新目的,其中首个参数是那个目的的原型

var o = Object.create(null); //o是一个没有原型的对象

syntax_only

收起“调用名称”,在底下的例证里它是“someClass::someMethod”。请留意纵然someClass::someMethod()是3个可调用的静态方法,可是此间并不是的确表示二个静态方法

6.2 属性的询问和设置

当使用方括号([])运算符来获取属性的值时,方括号内的表达式必须回到字符串,恐怕是八个方可回到字符串的值

万一设置为 TRUE,这几个函数仅仅验证 name 大概是函数或格局。
它仅仅拒绝非字符,恐怕未蕴涵能用来回调函数的可行社团。有效的相应包含五个元素,首个是三个目的或然字符,第二个因素是个字符。

Return Values(返回值)

6.3 删除属性

delete运算符只能删除自有总体性,无法去除继承属性。
delete表明式删除成功后,再次回到true

callable_name

只要可调用重回true,否则再次来到false。

6.4 检测属性

propertyIsEnumerable()唯有检测到是自有总体性,且这么些天性的可枚举性为true时才回来true

接受“可调用的称号”。上面的例子是“someClass::someMethod”。
注意,尽管 someClass::SomeMethod()
的意义是可调用的静态方法,但例子的图景并不是这么的。

Examples(例子)

6.5 枚举属性

目的继承的嵌入方法成千上万,但在代码中给目的添加的品质都以可枚举的(除非将他们更换为多如牛毛的)
ECMAScript5概念了八个用于枚举属性名称的函数:

  • Object.keys(),重临贰个由对象中可枚举的自有质量的称呼组成的数组
  • Object.getOwnPropertyNames(),只回去对象的有所自有质量的名号

返回值:

<?php

第7章 数组

如果 name 可调用则赶回 TRUE,否则重回 FALSE

functionsomeFunction()

7.5 数组成分的丰硕和删除

用delete删除数组成分与为其赋undefined值是看似的,注意:使用delete删除数组成分的时候不会修改数组的length属性

参考文献: http://php.net/manual/zh/function.is-callable.php

{

7.8.3 sort()

为了按照其余办法而非字符顺序进行数组排序,必须给sort()方法传递2个相比函数,该函数决定了它的七个参数在排好序的数组中的先后顺序。若是第3个参数在前,比较函数应该回到八个小于0的数,第三个参数在后,相比函数重返三个大于0的数

 

}

7.9 ECMAScript5中定义的数组方法

  1. forEach() 该方法遍历数组,为每一个成分调用钦赐的函数
  2. map()该办法调用数组的各个成分传递给钦点的函数,并重返3个数组。

    var a = [1,2,3];
    b = a.map(function(x){
        return x*x
    }); //b = [1,4,9]
    
  3. filter()该办法再次来到的数组成分是调动的数组的1个子集,传递的函数是用来逻辑判定的

    var a = [1,2,3,4,5];
    samllValue = a.filter(function(x){
        return x < 3
    });  //[1,2]
    
  4. every()和some()
    every()当且仅当针对数组中负有因素调用判定函数都回去true,它才重临true。
    some()当针对数组中有着因素调用判定函数都回到false,它才回来false

    var a = [1,2,3,4,5];
    a.every(function(x){ return x < 0 })  //true
    a.every(function(x){ return x % 2 === 0}) //false
    a.some(function(x){ return x % 2 === 0 }) //true
    a.some(isNaN)  //false
    

一旦every()和some()确认重返什么值他们就会终止遍历数组元素 5.
reduce()和reduceRight() 使用钦点的函数将数组成分进行结合,生成单个值
javascript var a = [1,2,3,4,5]; var sum = a.reduce(function(x,y){return x + y },0); //15 var max = a.reduce(function(x,y){ return (x>y) ? x : y;}) //5
reduce()第2个参数执行化简操作的函数,该函数的x参数是数组的要素,y参数是上二回操作的结果值,第①个参数是二个传递给函数的开始值,当没有伊始值时专断认同为数组第3个成分
reduceRight()依据数组的目录从高到低处理数组

② 、函数测试

$functionVariable = ‘someFunction’;

7.11 类数组对象

javascript数组的局地特征是其他对象所没有的:

  • 当有新的因素添加到列表时,自动更新length属性
  • 设置length属性为三个较小值时将截断数组
  • 从Array.prototype中持续部分有效的法门
  • 其类属性为Array

测试一:

var_dump( is_callable($functionVariable, false, $callable_name) );//
   输出为:bool(true)

第8章 函数

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"

echo $callable_name, “\n”;            //    输出为: someFunction

8.7 函数的品质方法和构造函数

测试结果:

class someClass {

8.7.3 call()和apply()

要想以对象o的办法来调用f函数,可以那样使用:

f.call(o)
f.apply(o)

call()和apply()的首先个实参是要调用函数的母体,在函数内通过this来博取它的引用
区别:
对call()来说,第2个实参之后的具有实参都以要传播待调用函数的值,所传诵参数一一列出
apply()第二个实参之后的参数可以以参数数组的花样传播

对此匿名函数,传入函数变量后,参数二syntax_only true 和
false
,打印结果是同样的。

        functionsomeMethod()   {

8.7.4 bind()

当在函数f()上调用bind()方法并传到八个对象o作为参数,那一个艺术将回到一个新函数。新函数将会把原始函数f()当做o的措施来调用,传入新函数的别样实参都将盛传原始函数

function f(y){ return this.x + y; }
var o = { x : 1};
var g = f.bind(o);
g(2)  //3

测试二:

         }

第⑧章 类和模块

 

}

9.2 类和构造函数

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"

$anObject = new  someClass();

9.2.1 构造函数和类的标识符

a instanceof b 本质是检测a对象是或不是三番五次自b.prototype

 

$methodVariable = array($anObject, ‘someMethod’);

第捌章 正则表明式的情势匹配

测试结果:

var_dump( is_callable($methodVariable, true, $callable_name) );// 
输出为:bool(true)

10.1 正则表明式的定义

一个正则表达式直接量会在执行到它时转化为一个正则对象,同一段代码每趟运算都回到同二个目标

对于一般函数,传入函数名称后,参数二syntax_only true 和 false,打印结果是均等的。

echo $callable_name.”\n”;                //   
输出为:someClass::someMethod

10.1.1 直接量字符
^ $ . * + ? = ! : | \ / () [] {}

在正则表明式中拔取那个字符的直接量进行匹配,则必须采纳前缀\

测试三:

?>

10.1.2 字符类

将直接量字符单独放进方括号内就结成了字符类,三个字符类能够包容它所包蕴的任意字符

/[abc]/        匹配a,b,c中任意一个
/[^abc]/       匹配abc之外的所有字符
/[a-zA-Z0-9]/  匹配拉丁字母表中任何字母和数字
/[...]/        匹配方括号内任意字符
/[^...]/       匹配不在方括号内任意字符
/./            匹配除换行符和其他Unicode行终止符之外的任意字符
/\w/           匹配任何ASCII字符组成的单词  等价于/[a-zA-Z0-9]/
/\W/           匹配任何不是ASCII字符组成的单词  等价于/[^a-zA-Z0-9]/
/\d/           匹配任何ASCII数字   等价于/[0-9]/
/\D/           匹配除ASCII数字之外的任何字符   等价于/[^0-9]/
/\s/           匹配任何Unicode空白符
/\S/           匹配任何非Unicode空白符
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"

区别:

function_exists 相比较不难点,就是判断函数有没有被定义。

method_exists 是判定类内的章程存不存在。

is_callable 检测参数是还是不是为合法的可调用结构。

它们的归来值 都以 bool,可是参数不同。

function_exists唯有二个参数:函数名 $string

method_exists四个参数 :$object 类对象或$class类名称,$string 方法名

is_callable三个参数:$varmixed 能够是(string或许array)
,$syntax_only(bool),$callback_name(string)

如果is_callable的第1个参数是string,那么 和function_exists 相似
;就算是数组则和 method_exists相似,但又有例外:

(1)method_exists不会考虑类形式的概念范围public 、protected
、private,只要存在就回来true;而 is_callable 会在艺术是被 protecte、
private时再次来到false。

(2)is_callable会去调用__call魔术方法来判断,而method_exists不会。

10.3 重复

正则表明式的双重字符语法

{n,m}          匹配前一项至少n次,但不能超过m次
{n,}           匹配前一项n次或者更多
{n}            匹配前一项n次
?              匹配前一项0次或1次  等价于{0,1}
+              匹配前一项1次或多次  等价于{1,}
*              匹配前一项0次或多次  等价于{0,}

使用?,*时要小心,由于这几个字符串大概匹配0个字符,由此他们同意什么都不般配
非贪婪的再次
非贪婪的重新即尽也许少的匹配,只须在待匹配的字符后紧跟着一个问号即可

测试结果:

美高梅开户网址 ,10.1.4 采用分组和引用

字符”|”用于分隔供接纳的字符
/\d{3}|[a-z]{4}/非凡的是四位数字还是三个小写字母
注意选用项的合作次序是从左到右,直到发现匹配项,借使左侧的选取项匹配,就忽略左边的匹配项
正则表明式圆括号的有余用途:

  • 把单独的项组成子表明式,以便通过”*+?|”进行修饰 /java(script)?/
  • 允许在相同正则表明式的背后引用前边的子说明式
    \1引用的是首先个带圆括号的子表达式

|       匹配的是该表达式左边或右边的子表达式
(...)   将几个项组合为一个单元,这个单元可通过“*”,“+”,“?”和“|”等符号加以修饰,而且可以记住和这个组合相匹配的字符串以供此后的引用使用
(?...)   只组合,把项组合带一个单元,但不记忆与该组相匹配的字符
\n      和第n个分组第一次匹配的字符相匹配,组是圆括号中的子表达式

对于类的主意,参数以数组社团(类对象或类名称 +
方法名称),参数二syntax_only true 和
false
,打印结果也是均等的。

10.1.5 钦赐匹配岗位
^       匹配字符串的开头,在多行检索中匹配一行的开头
$       匹配字符串的结尾,在多行检索中匹配一行的结尾
\b      匹配一个单词的边界,简言之就是位于字符\w和\W之间的位置,或位于字符\W和字符串的开头或者结尾之间的位置
\B      匹配非单词边界的位置
(?=p)   零宽正向先行断言,要求接下来的字符都与p匹配,但不包括匹配p的那些字符
(?=p)   零宽负向先行断言,要求接下来的字符都不与p匹配

测试四:

10.1.6 修饰符
  • i 执行不区分轻重缓急写的匹配
  • g 执行2个大局匹配
  • m 多行匹配情势
$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"

10.2 用于方式匹配的string

search()
再次来到第三个与之匹配的子串的苗头地方,假若找不到分外则赶回-1。该措施不接济全局检索

"javascript".search(/script/i);  //4

replace() 用于检索与替换操作
第2个参数是3个正则表明式,第一个参数是要拓展交流的字符串。如正则表明式不带修饰符g,则只替换所匹配的率先个子串

text.replace(/javascript/gi,"JavaScript");
var quote = /"([^"]*)"/g;
text.replace(quote,'"$1"');

match(正则表明式) 重返的是一个由非凡结果组成的数组

"1 plus 2 euqals 3".match(/\d+/g);   //["1", "2", "3"]

split() 那几个法子用以将调用它的字符串拆分为2个子串组成的数组

"1, 2, 3, 4".split(/\s*,\s*/);   //["1","2","3","4"]

测试结果:

对此传播的求证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地图