当前位置:首页 > 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.  
  9. ?> 

这段代码的目的比较容易理解,有一个对象为$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.  
  15. $foo = new Foo(); 
  16.  
  17. $callbacks = array( 
  18.  
  19.     array($foo, 'PublicMethod'), 
  20.  
  21.     array($foo, 'PrivateMethod'), 
  22.  
  23.     array($foo, 'PublicStaticMethod'), 
  24.  
  25.     array($foo, 'PrivateStaticMethod'), 
  26.  
  27.     array('Foo', 'PublicMethod'), 
  28.  
  29.     array('Foo', 'PrivateMethod'), 
  30.  
  31.     array('Foo', 'PublicStaticMethod'), 
  32.  
  33.     array('Foo', 'PrivateStaticMethod'), 
  34.  
  35.    ); 
  36.  
  37. foreach ($callbacks as $callback){ 
  38.  
  39.     var_dump($callback); 
  40.  
  41.     var_dump(method_exists($callback[0], $callback[1])); 
  42.  
  43.     var_dump(is_callable($callback)); 
  44.  
  45.     echo str_repeat('-', 10); 
  46.  
  47.     echo '<br />'; 
  48.  
  49. } 

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

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.  
  15. $obj = new MethodTest(); 
  16.  
  17. $obj->runtest('in object context'); 
  18.  
  19. var_dump(method_exists($obj,'runtest')); 
  20.  
  21. var_dump(is_callable(array($obj,'runtest'))); 
  22.  
  23. echo '<br />'; 

运行结果

Calling object method runtest in object context

bool(false) bool(true)

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

Tags: is_callable method_exists

分享到: