多くの製品アプリケーションでは、オブジェクト内のメソッドが存在するかどうかを確認するために次のような使用法がよく見られます。
<?php if (method_exists($object, 'SomeMethod')) { $object->SomeMethod($this, TRUE); } ?
このコードの目的は比較的理解しやすいです。$object というオブジェクトがあります。それに SomeMethod というメソッドがあるかどうかを知りたいのです。ある場合は、このメソッドを呼び出します。
このコードは正しく見え、ほとんどの場合問題なく動作します。しかし、この $object オブジェクトのメソッドが現在の実行環境から見えない場合でも、プログラムは正常に実行できるのでしょうか?この関数名メソッドが存在するのと同様に、提供したクラスまたはオブジェクトに期待するメソッドがあるかどうかをチェックするだけです。ある場合は TRUE を返します。そうでない場合は FALSE を返します。可視性の問題はここでは考慮されません。したがって、プライベート メソッドまたはプロテクト メソッドを偶然決定した場合、正しい戻り値を取得できますが、実行時に「致命的エラー」エラー警告が表示されます。
上記のコードの本当の意図は、提供されたクラスまたはオブジェクトに対して、現在のスコープでその SomeMethod メソッドを呼び出すことができるかどうかということです。これが is_callable()
関数の目的です。 is_callable()
関数はコールバック パラメーターを受け取り、関数名またはメソッド名とオブジェクトを含む配列を指定できます。現在のスコープで実行できる場合は、TRUE を返します。
<?php if (is_callable(array($object, 'SomeMethod'))) { $object->SomeMethod($this, TRUE); }?>
2 つの関数の違いを説明するために例を示します。
<?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 />'; }
上記のスクリプトを実行すると、2 つの関数の違いが明確にわかります。
is_callable()
提供されたクラスやメソッドをチェックするのではなく、関数やメソッドの構文が正しいかどうかだけをチェックするなど、他の用途もあります。 method_exists()
と同様に、is_callable()
はクラスの自動ロードをトリガーできます。
オブジェクトにマジックメソッド __call
がある場合、メソッドを判断するときに method_exists()
は FALSE を返し、is_callable()
は返します。真実。
<?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() 関数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。