PHP的method_exists,function_exists,is_callable的区别

简介:

今天在YII框架事件处理中看到了is_callable函数,后来发现这个函数有与method_exists,function_exists有着使用的混淆的感觉,为了能更好的理解其功能,下面就来最个分析:(个人技术有限如果有误还请指正


is_callable

验证变量的内容是否能够进行函数调用

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


参数:$name 可以接受数组(包含两个元素,一个对象,一个方法名字符串)与字符串(函数名)。当然这只是正确的可调用函数的参数。

$syntax_only 为真时只验证 $name 参数可能为函数或方法(只判断传入的$name参数是不是简单的字符串,如果是数组会判断是不是只包含两个字符串或第一个是对象第二个是字符串)。如果为 false 会对$name判断更加准确(如果是字符串会判断函数是否可用或合法,当是数组时第一个参数必须是对象,第二个必须是字符串)。

$callable_name 返回(引用处理)调用函数的基本形式,如果前面判断失败返回$name参数(如果不是字符串会强制转换为字符串)。

154445811.jpg

上面的结果是 bool(true) bool(false)

当$syntax_only为假 会判断函数是否可用或合法,第一个 test 函数已经声明,所以返回true 第二个 test1 函数不存在,所以返回false。

154534258.jpg

上面的结果是 bool(true) bool(true)

当$syntax_only为真 只判断$name参数是不是字符串并不关心函数是否可用或合法,当然如果$name非字符串那么函数返回false。

160455273.jpg

上面的结果是 bool(true) bool(true) bool(false) bool(false)

当$syntax_only为假 会判断数组第一个参数是否为对象第二个参数是否为字符串并不关心是否为该对象的方法。

161009748.jpg

上面的结果是 bool(true) bool(true) bool(true) bool(false)

当$syntax_only为真 会判断数组第一个参数是否为对象或字符串第二个参数是否为字符串并不关心是否为该对象的方法。


这个函数用于判断某个变量是否为可调用的函数或方法,如果判断的是数组只会判断第一个是不是为对象($syntax_only为false时)或为字符串($syntax_only为true时),第二个是不是字符串,并不能判断是否有合法方法或是不是该对象的方法,如果$name是字符串会判断函数是否存在或合法($syntax_only为false)或该参数是不是字符串($syntax_only为true时)。当is_callable('a::test')也是为真的,因为这个只验证参数内容是否为可调用函数的。最后的一个参数只是提取调用函数的形式串,不论$name是否判断通过都会修改该参数的值,实际应用不大,当$name判断合法时,第三个参数为 " 类名::方法名 " 或 " 函数名 "如果失败返回的都是$name转为字符串的内容。


method_exists

检查类的方法是否存在

bool method_exists ($object, $method_name)

参数:$object 对象或类名字符串

$method_name 方法名字符串(只能为简单类型的变量,否则报错)

163545342.jpg



上面的结果是 bool(true) bool(true) bool(false)

只要第一个参数是可用的类名字符串或对象,第二个参数为类或对象包含的方法名字符串即返回真否则返回假。


function_exists

检查指定的函数是否已经定义

bool function_exists ($function_name)

参数:$function_name 函数名字符串

165113424.jpg

上面的结果是 bool(true) bool(false)

只要参数为可用的函数名返回真否则返回假。



到这里可以看出来is_callable是可以代替function_exists但不能代替method_exists(但可以作前期判断,否则程序易报错不具健全性,主要是因为is_callable并不判断方法是否为对象包含的)。

本文转自  ttlxihuan    51CTO博客,原文链接:http://blog.51cto.com/php2012web/1298815


相关文章
|
16天前
|
JavaScript
箭头函数与普通函数(function)的区别
箭头函数是ES6引入的新特性,与传统函数相比,它有更简洁的语法,且没有自己的this、arguments、super或new.target绑定,而是继承自外层作用域。箭头函数不适用于构造函数,不能使用new关键字调用。
|
15天前
|
JavaScript
箭头函数与普通函数(function)的区别
箭头函数是ES6引入的新语法,相比传统函数表达式更简洁,且没有自己的this、arguments、super或new.target绑定,而是继承自外层作用域。这使得箭头函数在处理回调和闭包时更加灵活方便。
ly~
|
2月前
|
安全 Java 大数据
php跟java有什么区别
PHP 和 Java 是两种常用编程语言,各有特色。PHP 语法简洁灵活,适用于快速开发中小型网站,尤其在 Web 脚本和数据库交互中表现出色。Java 则语法严谨,强类型特性使其在企业级应用、移动开发及大数据处理中更受欢迎,具备高稳定性和安全性。通过优化,PHP 性能可提升,而 Java 在大规模应用中表现更佳。总体而言,PHP 开发效率高但维护性稍差,Java 则更注重代码质量和安全性。
ly~
40 5
|
2月前
|
SQL 关系型数据库 数据库连接
php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别
本文介绍了PHP中PDO(PHP Data Objects)扩展的基本概念和使用方法。内容包括PDO类和PDOStatement类的介绍,PDO的简单使用,预定义占位符的使用方法,以及PDOStatement对象的使用。文章还讨论了绑定预定义占位符参数的不同形式,即bindValue和bindParam的区别。通过具体示例,展示了如何使用PDO进行数据库连接、数据查询、数据插入等操作。
php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别
|
5月前
|
PHP
PHP &&是什么,||是什么,&&和||有什么区别?
PHP &&是什么,||是什么,&&和||有什么区别?
30 1
|
5月前
|
JSON 数据格式
setInterval函数的function与()=>区别——解决Cannot readproperty‘XXXXXXX‘of undefined异常
setInterval函数的function与()=>区别——解决Cannot readproperty‘XXXXXXX‘of undefined异常
40 0
|
6月前
|
PHP
PHP public、protected、private、static、abstract、final、interface、implements 区别对比
PHP public、protected、private、static、abstract、final、interface、implements 区别对比
73 0
|
PHP
PHP - Laravel Blade模板注释 {{-- 注释 --}} 与 <!-- 注释 --> 的区别
PHP - Laravel Blade模板注释 {{-- 注释 --}} 与 <!-- 注释 --> 的区别
94 0