WithCoderWithCoderWithCoder

PHP函数学习之判断接口,类和方法是否存在

在PHP面向对象开发设计过程中,我们往往需要在调用某个接口(interface)、类(class)或方法(method)时判断它们是否存在,判断某个类是否实现了接口,类中是否存在某个方法,以及类中的方法是否可以调用等。常用的方法有 interface_exists(),class_exists(),method_exists(),function_exists()和is_callable()。

1. interface_exists() 检查接口是否已被定义

interface_exists ( string $interface_name [, bool $autoload = true ] ) : bool

interface_exists() 方法传入字符串的接口名interface_name,用于检查接口是否已经被定义。而可选的boolean类型参数autoload,用于在接口被定义时,是否默认调用 __autoload进行加载。如果由 interface_name 所指的接口已经定义,此函数返回 TRUE,否则返回 FALSE。

<?php
// 判断接口MyInterface是否被定义,返回false
var_dump(interface_exists('MyInterface', true));

返回结果为: 

    false

2. class_exists() 检查类是否已被定义

class_exists ( string $class_name [, bool $autoload = true ] ) : bool

class_exists() 方法传入字符串类型的类名class_name(类名不区分大小写),用于检查指定的类是否已经被定义。而可选的boolean类型参数autoload,用于在类被定义时,是否默认调用 __autoload进行加载。如果由 class_name 所指的类已经定义,此函数返回 TRUE,否则返回 FALSE。

<?php

// 定义类MyClass
class MyClass
{

}

// 判断类MyClass是否被定义,返回true
var_dump(class_exists('MyClass'));

返回结果为:

    true

3. method_exists()检查类的方法是否存在

method_exists ( mixed $object , string $method_name ) : bool

method_exists() 方法传入对象实例或字符串类型的类名参数 object(类名不区分大小写),以及指定的方法名 method_name (方法名不区分大小写),用于检查指定类的方法是否存在。如果 method_name 在 object 指定的类中已存在,此函数返回 TRUE,否则返回 FALSE。

<?php

// 定义类MyClass
class MyClass
{
   
// 定义方法myMethod
   
function myMethod()
   {
       
echo 'hello world';
   
}
}

// 判断类MyClass是否存在myMethod方法,返回true
var_dump(method_exists('MyClass','myMethod'));

返回结果为:

    true

4. function_exists() 如果给定的函数已经被定义就返回 TRUE

function_exists ( string $function_name ) : bool

function_exists() 在已经定义的函数列表(包括系统自带的函数和用户自定义的函数)中查找字符串类型的函数名 function_name。如果 function_name 存在且的确是一个函数就返回 TRUE ,反之则返回 FALSE 。(对于语法结构如 echo 放回 false)

<?php

// 定义类MyClass
class MyClass
{
   
// 定义方法myMethod
   
function myMethod()
   {
       
echo 'hello world';
   
}
}

// 定义函数myFunc
function myFunc()
{
   
echo 'hi';
}

// 判断函数myMethod是否被定义,返回false(函数myMethod没有单独定义)
var_dump(function_exists('myMethod'));
// 判断函数myFunc是否被定义,返回true(用户自定义函数)
var_dump(function_exists('myFunc'));

5. is_callable() 检测参数是否为合法的可调用结构

is_callable ( callable $name [, bool $syntax_only = false [, string &$callable_name ]] ) : bool

is_callable() 方法使用 name 变量验证内容能否作为函数调用。 它可以检查包含有效函数名的变量,或者一个数组,包含了正确编码的对象以及函数名。

如果 name 可调用则返回 TRUE,否则返回 FALSE。

<?php

// 定义类MyClass
class MyClass
{
   
// 定义方法myMethod
   
function myMethod()
   {
       
echo 'hello world';
   
}
}

// 定义函数myFunc
function myFunc()
{
   
echo 'hi';
}

// 判断函数myMethod是否可调用,返回false(函数myMethod没有单独定义)
var_dump(is_callable('myMethod'));
// 判断类MyClass的方法myMethod是否可调用,返回true
var_dump(is_callable(['MyClass', 'myMethod']));
// 判断函数myFunc是否可调用,返回true(用户自定义函数)
var_dump(is_callable('myFunc'));

相对来说,interface_exists(),class_exists(),method_exists(),function_exists()方法的调用都比较直接,意义也比较明确。而is_callable()函数要高级一些,它接受字符串变量形式的方法名作为 第一个参数,如果类方法存在并且可以调用,则返回true。如果要检测类中的方法是否能被调用,可以给函数传递一个数组而不是类的方法名作为参数。数组必须包含对象或类名,以将其作为它的第一个元素,要检查的方法名则作为第二个元素。如果该方法在类中存在,函数返回true。

php函数method_exists()与is_callable()的区别在于在php5中,一个方法存在并不意味着它就可以被调用。对于 private,protected和public类型的方法,method_exits()会返回true,但是is_callable()会检查存在其是否可以访问,如果是private,protected类型的,它会返回false。如下代码所示: 

<?php

// 定义类MyClass
class MyClass
{
   
private function myPrivateMethod()
   {

   }

   
// 定义方法myMethod
   
function myMethod()
   {
       
echo 'hello world';
   
}
}

// MyClass的私有方法myPrivateMethod是否存在,返回true
var_dump(method_exists('MyClass', 'myPrivateMethod'));
// MyClass的私有方法myPrivateMethod是否可调用,返回false
var_dump(is_callable(['MyClass', 'myPrivateMethod']));

总的来说,function_exists() 比较简单点就是判断函数有没有被定义,而method_exists() 是判断类内的方法存不存在,is_callable() 检测参数是否为合法的可调用结构,返回值都是 bool。

欢迎分享交流,转载请注明出处:WithCoder » PHP函数学习之判断接口,类和方法是否存在