有些时候,如require文件(避免重复包含某一函数)、选择性调用函数(根据已加载模块调用不同的方法)时,需要检查函数或者方法是否存在,主要借助以下函数:
?
(1)bool function_exists( string $function_name )
? ? ? ?检查函数是否存在,主要针对面向过程函数,内置函数或者用户定义函数;
? ? ? ?对于语法结构,如include_once、echo,其返回false;
class="php">var_dump(function_exists ('var_dump')); // true var_dump(function_exists ('echo')); // false var_dump(function_exists ('include_once')); // false
?
(2)bool method_exists ( object $object , string $method_name )
? ? ? ??检查类的方法是否存在,$object可以是类实例或者类名,两者之间没有任何区别;
? ? ? ??如果检查类不是已知类,调用此函数会使用任何已注册的autoloader;
? ? ? ??此方法不会检查方法是否可以被调用;
class Test { public function pub_func () { print_r(__METHOD__); } private function pri_func () { print_r(__METHOD__); } public function __call ($name, $args) { print_r(__METHOD__); } } var_dump(method_exists ('Test', 'pub_func')); // true var_dump(method_exists ('Test', 'pri_func')); // true var_dump(method_exists ('Test', 'not_func')); // false $t = new Test(); var_dump(method_exists ($t, 'pub_func')); // true var_dump(method_exists ($t, 'pri_func')); // true var_dump(method_exists ($t, 'not_func')); // false
?
(3)bool is_callable ( mixed $var [, bool $syntax_only [, string $callable_name ]] )
? ? ? ??检测参数是否为合法的可调用结构,既可用于检查普通函数,也可以用于检查类方法;
? ? ? ??$syntax_only默认为false;
? ? ? ??以类名为参数,且$syntax_only为false时,会尝试调用该方法(仅从可访问性方面,不检测__call),若方法不可访问(private),会出现Fatal error;
? ? ? ??在$syntax_only为true,或者以实例为参数时,__call也会纳入检查;
var_dump(is_callable (array( 'Test', 'pub_func'))); // true var_dump(is_callable (array( 'Test', 'pub_func'), true)); // true var_dump(is_callable (array( 'Test', 'pri_func'))); // PHP Fatal error: Call to private method Test::pri_func() var_dump(is_callable (array( 'Test', 'pri_func'), true)); // true var_dump(is_callable (array( 'Test', 'not_func'))); // false var_dump(is_callable (array( 'Test', 'not_func'), true)); // true $t = new Test(); var_dump(is_callable (array( $t, 'pub_func'))); // true var_dump(is_callable (array( $t, 'pub_func'), true)); // true var_dump(is_callable (array( $t, 'pri_func'))); // true var_dump(is_callable (array( $t, 'pri_func'), true)); // true var_dump(is_callable (array( $t, 'not_func'))); // true var_dump(is_callable (array( $t, 'not_func'), true)); // true