多くの製品アプリケーションでは、オブジェクト内のメソッドが存在するかどうかを確認するために使用される次のような使用法がよく見られます。
<?php if (method_exists($object, 'SomeMethod')) { $object->SomeMethod($this, TRUE); } ?>
このコードの目的は、$object というオブジェクトがあるので、SomeMethod というメソッドがあるかどうかを知りたいのです。
このコードは正しく見え、ほとんどの場合問題なく動作します。しかし、この $object オブジェクトのメソッドが現在の実行環境から見えない場合でも、プログラムは正常に実行できるのでしょうか?この関数名メソッドが存在するのと同様に、提供したクラスまたはオブジェクトに期待するメソッドがあるかどうかを確認するだけであり、存在しない場合は FALSE を返します。可視性の問題はここでは考慮されません。したがって、プライベート メソッドまたはプロテクト メソッドを偶然決定した場合、正しい戻り値を取得できますが、実行時に「致命的エラー」エラー警告が表示されます。
上記のコードの本当の意図は、提供されたクラスまたはオブジェクトに対して、現在のスコープでその SomeMethod メソッドを呼び出すことができるかどうかということです。そして、これがまさに is_callable()
関数の目的です。 is_callable()
関数はコールバック パラメーターを受け取り、関数名またはメソッド名とオブジェクトを含む配列を指定できます。現在のスコープで実行できる場合は、TRUE を返します。 is_callable()
函数存在的目的。is_callable()
函数接收一个回调参数,可以指定一个函数名称或者一个包含方法名和对象的数组,如果在当前作用域中可以执行,就返回TRUE。
<?php if (is_callable(array($object, 'SomeMethod'))) { $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, '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。
<?phpclass 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)
在很多产品应用中,我们经常能够看到以下这种用法,它用来检查一个对象里的方法是否存在。
<?phpif (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()
<?phpclass 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 />';
rrreee
上記のスクリプトを実行すると、2 つの関数の違いが明確にわかります。is_callable()
には他の用途もあります。たとえば、提供されたクラスやメソッドをチェックするのではなく、関数やメソッドの構文が正しいかどうかだけをチェックします。 method_exists()
と同様に、is_callable()
はクラスの自動ロードをトリガーできます。
オブジェクトにマジックメソッド __call
がある場合、メソッドを判定するときに method_exists()
は FALSE を返し、is_callable()
は TRUE を返します。 。 rrreee
is_callable()
関数の目的です。 is_callable()
関数はコールバック パラメーターを受け取り、関数名またはメソッド名とオブジェクトを含む配列を指定できます。現在のスコープで実行できる場合は、TRUE を返します。 🎜rrreee🎜 2 つの違いを説明するために例を挙げてみましょう🎜rrreee🎜 上記のスクリプトを実行すると、2 つの関数の違いが明確にわかります。 🎜🎜is_callable()
には他の用途もあります。たとえば、提供されたクラスやメソッドをチェックするのではなく、関数やメソッドの構文が正しいかどうかだけをチェックします。 method_exists()
と同様に、is_callable()
はクラスの自動ロードをトリガーできます。 🎜🎜オブジェクトにマジックメソッド __call
がある場合、メソッドを判定するときに method_exists()
は FALSE を返し、is_callable()
は TRUE を返します。 。 🎜rrreee🎜実行結果🎜🎜オブジェクトコンテキストでのオブジェクトメソッドruntestの呼び出し🎜bool(false) bool(true)🎜🎜🎜🎜以上がPHP の is_callable() 関数と method_exists() 関数を調べるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。