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

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

Sep 06, 2017 pm 04:24 PM
callable exists method

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

<?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。

<?php
    if (is_callable(array($object, &#39;SomeMethod&#39;))) {      
        $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, &#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。

<?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)

图示

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

<?phpif (method_exists($object, &#39;SomeMethod&#39;)) {   
    $object->SomeMethod($this, TRUE); 
}?>
登录后复制

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

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

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

<?php
    if (is_callable(array($object, &#39;SomeMethod&#39;))) {      
    $object->SomeMethod($this, TRUE); 
    }
?>
登录后复制

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

<?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。

<?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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PHP Fatal error: Call to a member function fetch()的解决方法 PHP Fatal error: Call to a member function fetch()的解决方法 Jun 23, 2023 am 09:36 AM

在使用PHP进行web应用开发时,很多时候会需要使用数据库。而在使用数据库时,错误提示是非常常见的事情。其中,PHPFatalerror:Calltoamemberfunctionfetch()是一种比较常见的错误,它会在使用PDO查询数据库时出现。那么,这个错误是怎么引起的,以及如何解决呢?本文将为大家详细阐述。一、错误产生原

Java中Synchronized的原理和使用场景以及Callable接口的使用方法及区别分析 Java中Synchronized的原理和使用场景以及Callable接口的使用方法及区别分析 Apr 21, 2023 am 08:04 AM

一、基本特点1.开始时是乐观锁,如果锁冲突频繁,就转换为悲观锁.2.开始是轻量级锁实现,如果锁被持有的时间较长,就转换成重量级锁.3.实现轻量级锁的时候大概率用到的自旋锁策略4.是一种不公平锁5.是一种可重入锁6.不是读写锁二、加锁工作过程JVM将synchronized锁分为无锁、偏向锁、轻量级锁、重量级锁状态。会根据情况,进行依次升级。偏向锁假设男主是一个锁,女主是一个线程.如果只有这一个线程来使用这个锁,那么男主女主即使不领证结婚(避免了高成本操作),也可以一直幸福的生活下去.但是女配出现

如何使用C#中的File.Exists函数判断文件是否存在 如何使用C#中的File.Exists函数判断文件是否存在 Nov 18, 2023 am 11:25 AM

如何使用C#中的File.Exists函数判断文件是否存在在C#的文件操作中,判断文件是否存在是一项基本的功能需求。File.Exists函数是C#中的一个用于判断文件是否存在的方法。本文将介绍如何使用C#中的File.Exists函数来判断文件是否存在,并提供具体的代码示例。引用命名空间在开始编写代码之前,首先需要引用System.IO命名空间,该命名空间

jQuery中POST请求方式的使用方法 jQuery中POST请求方式的使用方法 Feb 28, 2024 pm 09:03 PM

jQuery中POST请求方式的使用方法在Web开发中,经常会涉及到前端页面与后端服务器之间的数据交互。其中,POST请求是常用的一种方式,通过POST请求可以向后端服务器提交数据,并获取相应的返回结果。jQuery是一款流行的JavaScript库,提供了便捷的方法来进行AJAX请求,本文将介绍如何使用jQuery中的POST方法进行数据传输,并提供具体的

PHP报错:使用null作为callable的解决方法! PHP报错:使用null作为callable的解决方法! Aug 19, 2023 pm 05:01 PM

PHP报错:使用null作为callable的解决方法!在PHP开发过程中,经常会遇到一些报错信息,其中一个常见的错误是“使用null作为callable”。这个错误信息表明在调用一个可调用对象时,参数传递了null值,导致无法执行相应的操作。这种错误通常发生在调用回调函数、方法或类的实例时,我们需要正确地传递可调用对象作为参数。以下是一些常见的代码示例:回

java如何实现Callable接口创建线程类 java如何实现Callable接口创建线程类 May 11, 2023 am 11:58 AM

实现Callable接口创建线程类从Java5开始就提供了Callable接口,该接口是Runnable接口的增强版,Callable接口提供一个call()方法作为线程执行体,call()方法可以有返回值,call()方法可以声明抛出异常。booleancancel(booleanmay)试图取消该Future里关联的Callable任务。Vget()返回Call任务里call()方法的返回值。调用该方法会照成线程阻塞,必须等待子线程结束后才会得到返回值。Vget(longtimeout,Ti

java的Callable接口怎么使用 java的Callable接口怎么使用 Apr 19, 2023 am 09:58 AM

说明1、Callable接口可以返回结果或抛出异常任务,实现者可以定义无参数的call方法。2、有别于Thread和Runnable的run方法,Callable任务的执行方法是call。call()可以返回值,而run()方法不能返回。call()可以抛出受检查的异常,比如ClassNotFoundException,而run()不能抛出受检查的异常。实例classMyCallableimplementsCallable{MyCallable(){}@OverridepublicInteger

在MYSQL中使用EXISTS函数 在MYSQL中使用EXISTS函数 Feb 24, 2024 pm 05:15 PM

MYSQL中EXISTS的用法,附带代码示例在MYSQL数据库中,EXISTS是一个非常有用的操作符,用于判断一个子查询是否至少返回了一行数据。它通常与WHERE子句一起使用,以便根据子查询的结果筛选出满足条件的数据。使用EXISTS需要注意以下几点:EXISTS条件不关心子查询返回的具体数据,只关心是否有数据返回。EXISTS条件可以与其他的条件结合使用,

See all articles