PHP中的is_callable()与method_exists()函数
在许多产品利用中,我们经常能够看到以下这种用途,它用来检查一个对象里的办法可否存在。
<?php if (method_exists($object, 'SomeMethod')) { $object->SomeMethod($this, TRUE); } ?
这段代码的目的比力容易懂得,有一个对象为$object,我们想知道它可否有一个办法为SomeMethod,假如有,就调取此办法。
这个代码看起来准确,并且在大部分的时候运转也会正常。但是假如这个$object对象的办法关于当前的运转环境是不成见的,程序还能正常运转吗?正如这个函数名办法存在一样,只是对我们供给的类或对象检查可否有我们所盼望的办法,假如有,就返回TRUE,假如没有,就返回FALSE,这里并没有思考可见性的问题。所以,当你刚好推断一个私有或者受庇护的办法时,你能够得到一个准确的返回,但是施行的时候,会得到一个“Fatal Error”错误警告。
上面这段代码的真正企图应当懂得为:关于供给的类或者对象,我们能否在当前的作用域中调取它的SomeMethod办法。而这正是is_callable()
函数存在的目的。is_callable()
函数接收一个回调参数,可以指定一个函数名称或者一个包括办法名和对象的数组,假如在当前作用域中可以施行,就返回TRUE。
<?php if (is_callable(array($object, 'SomeMethod'))) { $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, '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){ var_dump($callback); var_dump(method_exists($callback[0], $callback[1])); var_dump(is_callable($callback)); echo str_repeat('-', 10); echo '<br />'; }
施行上面的足本后,我们会清楚地看到两个函数间的差异。
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)
引荐:PHP视频教程
以上就是PHP中的is_callable()与method_exists()函数的具体内容,更多请关注百分百源码网其它相关文章!