首页 > 后端开发 > php教程 > 探究PHP中is_callable()与method_exists()函数

探究PHP中is_callable()与method_exists()函数

一个新手
发布: 2023-03-15 18:52:02
原创
1430 人浏览过

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

1

2

3

4

5

<?php

    if (method_exists($object, &#39;SomeMethod&#39;)) {  

    $object->SomeMethod($this, TRUE);

    }

?>

登录后复制

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

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

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

1

2

3

4

5

<?php

    if (is_callable(array($object, &#39;SomeMethod&#39;))) {     

        $object->SomeMethod($this, TRUE);

    }

?>

登录后复制

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<?phpclass Foo {

    public function PublicMethod(){}   

    private function PrivateMethod(){}   

    public static function PublicStaticMethod(){}   

    private static function PrivateStaticMethod(){}

}

    $foo = new Foo();$callbacks = array(   

    array($foo, &#39;PublicMethod&#39;),   

    array($foo, &#39;PrivateMethod&#39;),   

    array($foo, &#39;PublicStaticMethod&#39;),   

    array($foo, &#39;PrivateStaticMethod&#39;),   

    array(&#39;Foo&#39;, &#39;PublicMethod&#39;),   

    array(&#39;Foo&#39;, &#39;PrivateMethod&#39;),   

    array(&#39;Foo&#39;, &#39;PublicStaticMethod&#39;),   

    array(&#39;Foo&#39;, &#39;PrivateStaticMethod&#39;),

   );

   foreach ($callbacks as $callback){

    var_dump($callback);

    var_dump(method_exists($callback[0], $callback[1]));

    var_dump(is_callable($callback));   

    echo str_repeat(&#39;-&#39;, 10);   

    echo &#39;<br />&#39;;

}

登录后复制

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

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

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

1

2

3

4

5

6

7

8

9

10

<?phpclass MethodTest {

    public function __call($name, $arguments){

      echo &#39;Calling object method &#39; . $name . &#39; &#39; .implode(&#39;, &#39;, $arguments);     

      echo &#39;<br />&#39;;

    }

}$obj = new MethodTest();$obj->runtest(&#39;in object context&#39;);

var_dump(method_exists($obj,&#39;runtest&#39;));

var_dump(is_callable(array($obj,&#39;runtest&#39;)));

 

echo &#39;<br />&#39;;

登录后复制

运行结果

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

图示

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

1

2

3

<?phpif (method_exists($object, &#39;SomeMethod&#39;)) {  

    $object->SomeMethod($this, TRUE);

}?>

登录后复制

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

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

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

1

2

3

4

5

<?php

    if (is_callable(array($object, &#39;SomeMethod&#39;))) {     

    $object->SomeMethod($this, TRUE);

    }

?>

登录后复制

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<?php

    class Foo {

    public function PublicMethod(){}   

    private function PrivateMethod(){}   

    public static function PublicStaticMethod(){}   

    private static function PrivateStaticMethod(){}

}

$foo = new Foo();$callbacks = array(   

    array($foo, &#39;PublicMethod&#39;),   

    array($foo, &#39;PrivateMethod&#39;),   

    array($foo, &#39;PublicStaticMethod&#39;),   

    array($foo, &#39;PrivateStaticMethod&#39;),   

    array(&#39;Foo&#39;, &#39;PublicMethod&#39;),   

    array(&#39;Foo&#39;, &#39;PrivateMethod&#39;),   

    array(&#39;Foo&#39;, &#39;PublicStaticMethod&#39;),   

    array(&#39;Foo&#39;, &#39;PrivateStaticMethod&#39;),

   );

   foreach ($callbacks as $callback){

    var_dump($callback);

    var_dump(method_exists($callback[0], $callback[1]));

    var_dump(is_callable($callback));   

    echo str_repeat(&#39;-&#39;, 10);   

    echo &#39;<br />&#39;;

}

登录后复制

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

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

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

1

2

3

4

5

6

7

8

9

10

<?phpclass MethodTest {

    public function __call($name, $arguments){

      echo &#39;Calling object method &#39; . $name . &#39; &#39; .implode(&#39;, &#39;, $arguments);     

      echo &#39;<br />&#39;;

    }

}

$obj = new MethodTest();$obj->runtest(&#39;in object context&#39;);

var_dump(method_exists($obj,&#39;runtest&#39;));

var_dump(is_callable(array($obj,&#39;runtest&#39;)));

echo &#39;<br />&#39;;

登录后复制

运行结果

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

图示

以上是探究PHP中is_callable()与method_exists()函数 的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板