is_callable で true を返す値と呼び出し方法
前の記事の流れで、「どんな値で is_callable が true を返すのか」「is_callable で判定した後 $obj() で呼び出しちゃっていいのか」とか、色々気になったので調べてみた。
調べてみた結果、注意したいのは、
- is_callable($obj) が true だからといって $obj() で呼び出せるとは限らない
- call_user_func($obj) を使う
- '<クラス名>::<インスタンスメソッド名>' も true になる
- 呼び出すと E_STRICT が発生する
ってところかな。
以下、調べてみた結果。
PHP 5.3.27, 5.4.17, 5.5.1 で確認しました。
前提
<?php $fn = function() {}; function hoge() {} class Foo { public function method() {} public static function staticMethod() {} } $foo = new Foo();
$obj に代入して色々した結果
$obj | is_callable($obj) | call_user_func($obj) | $obj() |
---|---|---|---|
$fn | true | ○ | ○ |
'hoge' | true | ○ | ○ |
'Foo::method' | true | ※1 | × |
'Foo::staticMethod' | true | ○ | × |
array('Foo', 'method') | true | ※1 | ※1,2 |
array('Foo', 'staticMethod') | true | ○ | ※2 |
array($foo, 'method') | true | ○ | ※2 |
array($foo, 'staticMethod') | true | ○ | ※2 |
※1: E_STRICT が出る
※2: 5.3.27 では×
ちなみにクラス名、関数名は名前空間に対応してるのと、クラスはトレイトに変えても同じ動きでした。(インスタンスは作れないので、最後の2つは除く)
あと、メソッドの可視性チェックはしてくれます。