コールバック

コールバックは、PHP 5.4 以降では callable タイプヒントで表されます。 このページでは、callback 型情報を同じ目的で使っています。

call_user_func()usort() 等の関数は、ユーザーが定義するコールバック関数を引数として受け入れます。 コールバック関数は、単純な関数だけでなく、オブジェクトのメソッド あるいはクラスの静的メソッドであってもかまいません。

受け渡し

PHP 関数はその名前を単に文字列として渡します。 どのようなビルトインまたはユーザー定義の関数も渡すことができます。 ただし、 array(), echo, empty(), eval(), exit(), isset(), list(), print あるいは unset() といった言語構造はコールバックとしては使えないことに注意しましょう。

オブジェクトのインスタンスを渡すには配列を使います。 配列の 0 番目の要素にオブジェクトを、 そして 1 番目の要素にメソッド名を指定します。

静的なクラスメソッドの場合、オブジェクトのインスタンスは不要です。 0 番目の要素として、オブジェクトのかわりにクラス名を指定します。 PHP 5.2.3 以降では、 'ClassName::methodName' 形式で指定することもできます。

一般的なユーザー定義関数とは異なり、 無名関数 もパラメータとして渡せます。

例1 コールバック関数の例

<?php 

// コールバック関数の例
function my_callback_function() {
    echo 
'hello world!';
}

// コールバックメソッドの例
class MyClass {
    static function 
myCallbackMethod() {
        echo 
'Hello World!';
    }
}

// タイプ 1: 単純なコールバック
call_user_func('my_callback_function'); 

// タイプ 2: 静的クラスメソッドのコール
call_user_func(array('MyClass''myCallbackMethod')); 

// タイプ 3: オブジェクトメソッドのコール
$obj = new MyClass();
call_user_func(array($obj'myCallbackMethod'));

// タイプ 4: 静的クラスメソッドのコール (PHP 5.2.3 以降)
call_user_func('MyClass::myCallbackMethod');

// タイプ 5: 相対指定による静的クラスメソッドのコール (PHP 5.3.0 以降)
class {
    public static function 
who() {
        echo 
"A\n";
    }
}

class 
extends {
    public static function 
who() {
        echo 
"B\n";
    }
}

call_user_func(array('B''parent::who')); // A
?>

例2 クロージャを使ったコールバックの例

<?php
// クロージャ
$double = function($a) {
    return 
$a 2;
};

// 数値の範囲
$numbers range(15);

// ここでクロージャをコールバックとして使用し、
// 指定した範囲の各要素の二倍の値を計算します
$new_numbers array_map($double$numbers);

print 
implode(' '$new_numbers);
?>

上の例の出力は以下となります。

2 4 6 8 10

注意: PHP 4 では、実際のオブジェクトを指すコールバックを作成するには、 コピーではなく参照を使わなければなりませんでした。 詳細は 参照についての説明 を参照ください。

注意:

call_user_func()call_user_func_array() で登録されたコールバックは、 前のコールバックからスローされた例外がキャッチされていない場合はコールされません。

add a note add a note

User Contributed Notes 5 notes

up
17
steve at mrclay dot org
2 years ago
Performance note: The callable type hint, like is_callable(), will trigger an autoload of the class if the value looks like a static method callback.
up
18
andrewbessa at gmail dot com
2 years ago
You can also use the $this variable to specify a callback:

<?php
class MyClass {

    public
$property = 'Hello World!';

    public function
MyMethod()
    {
       
call_user_func(array($this, 'myCallbackMethod'));
    }

    public function
MyCallbackMethod()
    {
        echo
$this->property;
    }

}
?>
up
9
computrius at gmail dot com
1 year ago
When specifying a call back in array notation (ie. array($this, "myfunc") ) the method can be private if called from inside the class, but if you call it from outside you'll get a warning:

<?php

class mc {
   public function
go(array $arr) {
      
array_walk($arr, array($this, "walkIt"));
   }

   private function
walkIt($val) {
       echo
$val . "<br />";
   }

    public function
export() {
        return array(
$this, 'walkIt');
    }
}

$data = array(1,2,3,4);

$m = new mc;
$m->go($data); // valid

array_walk($data, $m->export()); // will generate warning

?>

Output:
1<br />2<br />3<br />4<br />
Warning: array_walk() expects parameter 2 to be a valid callback, cannot access private method mc::walkIt() in /in/tfh7f on line 22
up
3
metamarkers at gmail dot com
1 year ago
you can pass an object as a callable if its class defines the __invoke() magic method..
up
-4
Yzmir Ramirez
7 months ago
> As of PHP 5.2.3, it is also possible to pass 'ClassName::methodName'

You can also use 'self::methodName'.  This works in PHP 5.2.12 for me.
To Top