设为首页 收藏本站
查看: 1079|回复: 0

[经验分享] PHP的method_exists,function_exists,is_callable的区别

[复制链接]

尚未签到

发表于 2018-12-24 10:10:38 | 显示全部楼层 |阅读模式
  今天在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参数(如果不是字符串会强制转换为字符串)。

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


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


  上面的结果是 bool(true) bool(true) bool(false) bool(false)
  当$syntax_only为假 会判断数组第一个参数是否为对象第二个参数是否为字符串并不关心是否为该对象的方法。

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


  上面的结果是 bool(true) bool(true) bool(false)
  只要第一个参数是可用的类名字符串或对象,第二个参数为类或对象包含的方法名字符串即返回真否则返回假。
  

function_exists
  检查指定的函数是否已经定义
  bool function_exists ($function_name)
  参数:$function_name 函数名字符串


  上面的结果是 bool(true) bool(false)
  只要参数为可用的函数名返回真否则返回假。
  

  

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





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-655167-1-1.html 上篇帖子: 安装php遇到一些常见问题 下篇帖子: php入门篇
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表