您现在的位置: 365建站网 > 365文章 > php中is_callable()与method_exists()函数用法和区别

php中is_callable()与method_exists()函数用法和区别

文章来源:365jz.com     点击数:1074    更新时间:2018-01-07 09:42   参与评论
method_exists函数用法

(PHP 4, PHP 5, PHP 7)
method_exists — 检查类的方法是否存在

说明

bool method_exists ( mixed $object , string $method_name )
检查类的方法是否存在于指定的 object中。

参数

object
对象示例或者类名。

method_name
方法名。

返回值

如果 method_name 所指的方法在 object 所指的对象类中已定义,则返回 TRUE,否则返回 FALSE。


is_callable函数用法

(PHP 4 >= 4.0.6, PHP 5)
is_callable — 验证变量的内容是否能够进行函数调用

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

验证变量的内容是否能够进行函数调用。可以用于检查一个变量是否包含一个有效的函数名称,或者一个包含经过合适编码的函数和成员函数名的数组。
Parameters(参数)
name
既可以是一个字符串类型的函数名称,也可以是一个对象和成员函数名的组合数组,比如:array($SomeOject, 'MethodName')
syntax_only
如果设置为true,那么只是验证name是一个函数或者方法,函数仅仅会拒绝不是字符串,亦或是结构不合法的数组作为回调函数。合法结构是指一个包含两个成员的数组,第一个是对象或者字符串,第二个是一个字符串。

callable_name
接收“调用名称”,在下面的例子里它是“someClass::someMethod"。请注意尽管someClass::someMethod()是一个可调用的静态方法,但是这里并不是真的表示一个静态方法

Return Values(返回值)

如果可调用返回true,否则返回false。


php函数method_exists() 与is_callable()的区别在哪?在php面相对象设计过程中,往往我们需要在调用某一个方法是否属于某一个类的时候做出判断,常用的方法有 method_exists()和is_callable(),相比之下,is_callable()函数要高级一些,它接受字符串变量形式的方法名作为 第一个参数,如果类方法存在并且可以调用,则返回true。如果要检测类中的方法是否能被调用,可以给函数传递一个数组而不是类的方法名作为参数。数组必须包含对象或类名,以将其作为它的第一个元素,要检查的方法名则作为第二个元素。如果该方法在类中存在,函数返回true。
代码示例:
if ( is_callable( array( $obj, $method ) ) ) 
{ 
/*要操作的代码段*/
} 

is_callable()可以加收另外一个参数:一个布尔值,如果将该参数设置为true,函数仅仅检查给定的方法或函数名称的语法是否正确,而不检查其是否真正存在。method_exists()函数的参数为一个对象(或类名)和一个方法名,如果给定方法在对象的类中存在,则返回true
代码示例:
if ( method_exists( $obj, $method ) ) 
{ 
/*要操作的代码段*/
} 

php函数method_exists()与is_callable()的区别在于在php5中,一个方法存在并不意味着它就可以被调用。对于 private,protected和public类型的方法,method_exits()会返回true,但是is_callable()会检查存在其是否可以访问,如果是private,protected类型的,它会返回false。

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

<?phpif (method_exists($object, 'SomeMethod')) { 
    $object->SomeMethod($this, TRUE);
}?>

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

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

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

<?phpif (is_callable(array($object, 'SomeMethod'))) {    
$object->SomeMethod($this, TRUE);
}?>

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

<?phpclass Foo {
    public function PublicMethod(){}  
    private function PrivateMethod(){}  
    public static function PublicStaticMethod(){}  
    private static function PrivateStaticMethod(){}
}$foo = new Foo();$callbacks = array(  
array($foo, 'PublicMethod'),  
array($foo, 'PrivateMethod'),  
array($foo, 'PublicStaticMethod'),  
array($foo, 'PrivateStaticMethod'),  
array('Foo', 'PublicMethod'),  
array('Foo', 'PrivateMethod'),  
array('Foo', 'PublicStaticMethod'),  
array('Foo', 'PrivateStaticMethod'),
   );foreach ($callbacks as $callback){
    var_dump($callback);
    var_dump(method_exists($callback[0], $callback[1]));
    var_dump(is_callable($callback));  
    echo str_repeat('-', 10);  
    echo '<br />';
}

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

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

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

<?phpclass MethodTest {
    public function __call($name, $arguments){
      echo 'Calling object method ' . $name . ' ' .implode(', ', $arguments);      echo '<br />';
    }
}$obj = new MethodTest();$obj->runtest('in object context');
var_dump(method_exists($obj,'runtest'));
var_dump(is_callable(array($obj,'runtest')));echo '<br />';

运行结果

Calling object method runtest in object context
bool(false) bool(true)


图示

以上就是php中is_callable()与method_exists()函数具体区别介绍的详细内容



如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛

发表评论 (1074人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
昵称:
最新评论
------分隔线----------------------------

快速入口

· 365软件
· 杰创官网
· 建站工具
· 网站大全

其它栏目

· 建站教程
· 365学习

业务咨询

· 技术支持
· 服务时间:9:00-18:00
365建站网二维码

Powered by 365建站网 RSS地图 HTML地图

copyright © 2013-2024 版权所有 鄂ICP备17013400号