php 中 function_exists 、 method_exists 和 is_callable

在判断类、方法、可调用结构的时候经常用到以下方法:

1、function_exists — Return TRUE if the given function has been defined

2、method_exists  — Checks if the class method exists

3、is_callable — Verify that the contents of a variable can be called as a function

function_exists 比较简单点就是判断函数有没有被定义 而method_exists 是判断类内的方法存不存在  is_callable 检测参数是否为合法的可调用结构

返回值 都是 bool

但是参数不同

function_exists  只有一个参数   函数名 $string

method_exists  两个参数    $object 类对象   $string 方法名

is_callable   三个参数    $var  mixed 可以是string  array   $syntax_only  bool   $callback_name  string

如果is_callable的第一个参数 是 string  那么 和 function_exists 相似     如果是数组  则和 method_exists

但又有不同

method_exists不会考虑类方法的定义范围  public  protected  private  而 is_callable 会在方法是被 protected private 返回 false

is_callable判断是会去调用__call魔术方法来判断,而method_exists不会  用PHP.net上的例子解释就是:

Example:
<?php

class Test {

public function testing($not = false) {
        $not = $not ? ‘true‘ : ‘false‘;
        echo "testing - not: $not<br/>";
    }
    
    public function __call($name, $args) {
        if(preg_match(‘/^not([A-Z]\w+)$/‘, $name, $matches)) {
            $fn_name = strtolower($matches[1]);
            if(method_exists($this, $fn_name)) {
                $args[] = true; // add NOT boolean to args
                return call_user_func_array(array($this, $matches[1]), $args);
            }
        }
        die("No method with name: $name<br/>");
    }

}

$t = new Test();
$t->testing();
$t->notTesting();

echo "exists: ".method_exists($t, ‘notTesting‘).‘<br/>‘;
echo "callable: ".is_callable(array($t, ‘notTesting‘));

?>

Output:

testing - not: false
testing - not: true
exists:
callable: 1

时间: 2024-10-10 16:17:23

php 中 function_exists 、 method_exists 和 is_callable的相关文章

判断某个方法是否存在,解析php函数function_exists (),method_exists()与is_callable()的区别

php函数function_exists (),method_exists() 与is_callable()的区别在哪? 先来讲下后两个:method_exists() 与is_callable(): 在php面相对象设计过程中,往往我们需要在调用某一个方法是否属于某一个类的时候做出判断,常用的方法有 method_exists()和is_callable() 相比之下,is_callable()函数要高级一些,它接受字符串变量形式的方法名作为 第一个参数,如果类方法存在并且可以调用,则返回tr

检测某个方法是否属于某个类中--解析php函数method_exists()与is_callable()的区别

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

php中method_exists()和is_callable()如何进行语句判断

method_exists()和is_callable()方法进行判断.那么两则区别是什么呢? 已知类文件如下: class Student{private $alias=null;private $name='';public function __construct($name){$this->name=$name;}private function setAlias($alias){$this->alias=$alias;}public function getName(){return

解析php函数method_exists()与is_callable()的区别

解析php函数method_exists()与is_callable()的区别 本篇文章是对php中method_exists()与is_callable()的区别进行了详细的分析介绍,需要的朋友参考下 php函数method_exists() 与is_callable()的区别在哪?在php面相对象设计过程中,往往我们需要在调用某一个方法是否属于某一个类的时候做出判断,常用的方法有 method_exists()和is_callable(),相比之下,is_callable()函数要高级一些,

php函数method_exists()与is_callable()的区别

在编程中,我们有的时候需要判断某个类中是否包含某个方法,除了使用反射机制,PHP还提供了method_exists()和is_callable()方法进行判断.那么两则区别是什么呢? 已知类文件如下: class Student{ private $alias=null; private $name=''; public function __construct($name){ $this->name=$name; } private function setAlias($alias){ $th

《PHP实用函数手册》系列技术文章整理收藏

<PHP实用函数手册>系列技术文章整理收藏 1PHP函数补完:error_reporting()http://www.lai18.com/content/425520.html 2PHP函数补完:get_magic_quotes_gpc()http://www.lai18.com/content/425521.html 3PHP函数补完:isset()http://www.lai18.com/content/425514.html 4PHP函数补完:array_multisort()http:

用php实现一个简单的链式操作

最近在读<php核心技术与最佳实践>这本书,书中第一章提到用__call()方法可以实现一个简单的字符串链式操作,比如,下面这个过滤字符串然后再求长度的操作,一般要这么写: strlen(trim($str)); 那么能否实现下面这种写法呢? $str->trim()->strlen(); 下面就来试下. 链式操作,说白了其实就是链式的调用对象的方法.既然要实现字符串的链式操作,那么就要实现一个字符串类,然后对这个类的对象进行调用操作.我对字符串类的期望如下:(1)当我创建对象时,

相关的链接

<!DOCTYPE NETSCAPE-Bookmark-file-1><!-- This is an automatically generated file.It will be read and overwritten.Do Not Edit! --><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"><TITLE>Bookmarks

php学习笔记2016.1

基本类型    PHP是一种弱类型语言.      PHP类型检查函数   is_bool()    is_integer()  is_double()  is_string()   is_object()  is_array()  is_resource()   is_null()   继承   继承是从一个基类得到一个或多个派生系类的机制.  继承自另一个类的类被称为该类的子类.  子类可以增加父类(也称超类,superclass)之外新的功能,因此子类也被称为扩展.   构造方法和继承