当前位置: 首页 > article >正文

php ismethod,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参数(如果不是字符串会强制转换为字符串)。

389bd13af574385bbfc5318c8fd899c2.png

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

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

dd65cdbd51f8ec22890f0a40578f5203.png

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

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

a43a75a14fa007afefa98d65f09841bd.png

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

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

59e15f6916001580e5da534a93c6d7a1.png

上面的结果是 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 方法名字符串(只能为简单类型的变量,否则报错)

1e6b828dc06444d40ebd4244d013dcd3.png

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

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

function_exists

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

bool function_exists ($function_name)

参数:$function_name 函数名字符串

1b272d5a7cc25221b316c93418143f19.png

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

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

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

http://www.lryc.cn/news/2416461.html

相关文章:

  • linux ioctl 函数
  • #SATA# SATA 专业术语
  • 工作流引擎 介绍
  • 权限持久化---映像劫持检测(Shift后门)
  • 【金士顿PS2251-03(PS2303)量产教程_2024】
  • Winedit修改快捷键
  • 推荐一款强大的Go语言工具:goid
  • GitHub Pages + Jekyll 快速搭建个人博客网站
  • JavaScript(BOM)中Window对象的prompt()方法
  • 注意力机制总结
  • windows配置防火墙
  • Sōsh:让宅男宅女从虚拟回到现实的社交网站
  • 一秒教你保存浏览器当前页面的所有图片
  • 若要使他人能够在远程计算机上查看此特定错误消息的详细信息,请在位于当前 Web 应用程序根目录下的“web.config”配置文件中创建一个 customErrors 标记。然后应将此 cust
  • 开放数据源
  • cetnos下gotop安装和使用
  • OpenCV AI Kit(OAK)官方答疑录
  • 数字世界的守护者——数字签名与证书全面解析!
  • java resultset getmetadata_Java ResultSetMetaData getColumnType()方法与示例
  • 网络编程2之sockaddr与sockaddr_in的区别
  • 软件体系结构风格介绍
  • Frostmourne - Elasticsearch源日志告警配置,大数据开发基础面试题
  • radmin 3.4 绿色版
  • PHP中json_decode函数
  • 一.常见的视频格式有哪些?
  • FPGA组合逻辑设计——译码器
  • EastFax电子传真信创国产化出炉,网络传真换新颜
  • 爬虫xx网站论坛的帖子源码分享
  • FTPrush给Linux上传文件,LINUX CENTOS 7安装FTP服务器详细讲解(配图),FTPRUSH连接上传测试文件...
  • 【计算机网络】TCP和UDP的特点及区别