必威体育Betway必威体育官网
当前位置:首页 > IT技术

【PHP】is_callable()与method_exists()函数

时间:2019-09-11 16:41:10来源:IT技术作者:seo实验室小编阅读:55次「手机版」
 

method_exists

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

<?php

if (method_exists($object, 'SomeMethod')) {   

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

}

?>

   1

   2

   3

   4

   5

   6

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

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

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

<?php

if (is_callable(array($object, 'SomeMethod'))) {

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

}?>

   1

   2

   3

   4

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

<?php

class 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 />';

}

   1

   2

   3

   4

   5

   6

   7

   8

   9

   10

   11

   12

   13

   14

   15

   16

   17

   18

   19

   20

   21

   22

   23

   24

   25

   26

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

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

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

<?php

class 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 />';

   1

   2

   3

   4

   5

   6

   7

   8

   9

   10

   11

   12

运行结果

Calling object method runtest in object context

bool(false) bool(true)

图示

---------------------

https://blog.csdn.net/qq_28602957/article/details/65444356

相关阅读

C语言scanf函数详细解释

此文章转载自:https://blog.csdn.net/21aspnet/article/details/174326函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(

创建提示消息对话框——AfxMessageBox与MessageBox函

创建消息提示对话框 1.1 MessageBox()的函数原型如下: int MessageBox(   LPCTSTR lpszText,   LPCTSTR lpszCaption = N

一个高斯函数的应用

最近测试一个项目场景,需要模糊视频,由于高斯模糊已经很常见了,所以我们就不再自己实现了。网上也有各种实现。一 ffmpeg里面的高斯

Linux下read和write函数复制一个文件

Open 函数返回值:若成功,返回未见描述符;若出错,返回-1Path参数是要打开或创建文件的名字。Oflag参数可用来说明此函数的多个选项。

python3中的drop_duplicates函数(对数据进行去重处理)

我们知道这个函数是去重处理函数 ,单列进行处理比较好理解但是如果多列进行处理具体啥意思呢?用上述数据表示:简单理解 如果df_part_

分享到:

栏目导航

推荐阅读

热门阅读