Blog, The

1 月 22 日生まれ、ブログ座です。

is_callable で true を返す値と呼び出し方法

前の記事の流れで、「どんな値で is_callable が true を返すのか」「is_callable で判定した後 $obj() で呼び出しちゃっていいのか」とか、色々気になったので調べてみた。

PHP: is_callable - Manual

調べてみた結果、注意したいのは、

  • 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つは除く)
あと、メソッドの可視性チェックはしてくれます。