当前位置:首页 > PHP教程 > php函数 > 列表

PHP中的is_callable()与method_exists()函数

发布:smiling 来源: PHP粉丝网  添加日期:2022-06-06 08:25:49 浏览: 评论:0 

在很多产品应用中,我们经常能够看到以下这种用法,它用来检查一个对象里的方法是否存在。

  1. <?php 
  2.  
  3. if (method_exists($object, 'SomeMethod')) {    
  4.  
  5.     $object->SomeMethod($this, TRUE);  
  6.  
  7.  
  8. ?> 

这段代码的目的比较容易理解,有一个对象为$object,我们想知道它是否有一个方法为SomeMethod,如果有,就调用此方法。

这个代码看起来正确,而且在大部分的时候运行也会正常。但是如果这个$object对象的方法对于当前的运行环境是不可见的,程序还能正常运行吗?正如这个函数名方法存在一样,只是对我们提供的类或对象检查是否有我们所期望的方法,如果有,就返回TRUE,如果没有,就返回FALSE,这里并没有考虑可见性的问题。所以,当你恰好判断一个私有或者受保护的方法时,你能够得到一个正确的返回,但是执行的时候,会得到一个“Fatal Error”错误警告。

上面这段代码的真正意图应该理解为:对于提供的类或者对象,我们能否在当前的作用域中调用它的SomeMethod方法。而这正是is_callable()函数存在的目的。is_callable()函数接收一个回调参数,可以指定一个函数名称或者一个包含方法名和对象的数组,如果在当前作用域中可以执行,就返回TRUE。

  1. <?php 
  2.  
  3. if (is_callable(array($object, 'SomeMethod'))) { 
  4.  
  5.       $object->SomeMethod($this, TRUE);  
  6.  
  7. }?> 

下面来举个例子来说明两者的区别

  1. <?php 
  2.  
  3. class Foo { 
  4.  
  5.     public function PublicMethod(){} 
  6.  
  7.     private function PrivateMethod(){} 
  8.  
  9.     public static function PublicStaticMethod(){} 
  10.  
  11.     private static function PrivateStaticMethod(){} 
  12.  
  13.  
  14. $foo = new Foo(); 
  15.  
  16. $callbacks = array
  17.  
  18.     array($foo'PublicMethod'), 
  19.  
  20.     array($foo'PrivateMethod'), 
  21.  
  22.     array($foo'PublicStaticMethod'), 
  23.  
  24.     array($foo'PrivateStaticMethod'), 
  25.  
  26.     array('Foo''PublicMethod'), 
  27.  
  28.     array('Foo''PrivateMethod'), 
  29.  
  30.     array('Foo''PublicStaticMethod'), 
  31.  
  32.     array('Foo''PrivateStaticMethod'), 
  33.  
  34.    ); 
  35.  
  36. foreach ($callbacks as $callback){ 
  37.  
  38.     var_dump($callback); 
  39.  
  40.     var_dump(method_exists($callback[0], $callback[1])); 
  41.  
  42.     var_dump(is_callable($callback)); 
  43.  
  44.     echo str_repeat('-', 10); 
  45.  
  46.     echo '<br />'
  47.  

执行上面的脚本后,我们会清晰地看到两个函数间的差别。

is_callable()还有其他的用法,例如,不检查所提供的类或方法,只检查函数或方法的语法是否正确。像method_exists()一样,is_callable()可以触发类的自动加载。

如果一个对象存在魔术方法__call,在进行方法判断时method_exists()会返回FALSE,而is_callable()会返回TRUE。

  1. <?php 
  2.  
  3. class MethodTest { 
  4.  
  5.     public function __call($name$arguments){ 
  6.  
  7.       echo 'Calling object method ' . $name . ' ' .implode(', '$arguments); 
  8.  
  9.       echo '<br />'
  10.  
  11.     } 
  12.  
  13.  
  14. $obj = new MethodTest(); 
  15.  
  16. $obj->runtest('in object context'); 
  17.  
  18. var_dump(method_exists($obj,'runtest')); 
  19.  
  20. var_dump(is_callable(array($obj,'runtest'))); 
  21.  
  22. echo '<br />'

运行结果

Calling object method runtest in object context

bool(false) bool(true)

PHP中的is_callable()与method_exists()函数

Tags: is_callable method_exists

分享到: