is_callable()与method_exists()函数

本文对比了PHP中method_exists与is_callable函数的区别,详细介绍了两者在检查类方法存在性时的行为差异,尤其是在处理私有和受保护方法时的不同表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

<?php
if (method_exists($object'SomeMethod')) {   
    $object->SomeMethod($thisTRUE); 
}
?>

不管方法是否可见(private,protected),method_exists 否会返回 TRUE

如果我们想不可见的返回 FALSE ,就需要使用方法 is_callable

函数接收一个回调参数,可以指定一个函数名称或者一个包含方法名和对象的数组

区别

看例子:

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){
    echo "<pre>";
    var_dump($callback);
    var_dump(
        [
            'method_exists' => method_exists($callback[0], $callback[1]),
            'is_callable' => is_callable($callback),
        ]
    );

    echo str_repeat('-', 30);
    echo '<br />';
}

比较

比较内容method_existsis_callable
适用范围仅适用类方法适用类方法和全局方法
是否有上下文是,会判断一个函数是否在当前环境中可调用(例如在子类中判断能否调用父类构造函数)
是否判断权限是,在类外,判断 private 和 protected 会返回false
是否调用 call方法
速度

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

运行结果

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值