PHP アドバンス

PHP コールバックファンクション

1. PHP コールバックファンクションとは?

コールバックファンクション(Callback Function)とは、別のファンクションにアーギュメント(引数)として渡されるファンクションのことです。

コールバックファンクションには以下の2つの形式があります:

  • 名前付きファンクション(Named function) - ファンクション名をストリングとして渡します。
  • アノニマスファンクション(Anonymous function) - ファンクションをインラインで定義し、アーギュメントとして渡します。

2. 名前付きファンクションをコールバックとして使用する

既存のファンクションはすべてコールバックファンクションとして利用可能です。名前付きファンクションをコールバックとして使用するには、別のファンクションのアーギュメントにファンクション名を含むストリングを渡します。

2.1 実装例

PHPの array_map() ファンクションにコールバックファンクションを渡し、アレイ内の各数値を2乗(自身を掛ける)する例です。

<?php
// 名前付きコールバックファンクションを定義
function myfunction($n) {
  return($n * $n);
}

// 乗算対象のアレイ
$numbers = [1, 2, 3, 4, 5];

// array_mapに myfunction をコールバックとして使用
print_r(array_map("myfunction", $numbers));
?>

3. アノニマスファンクションをコールバックとして使用する

アノニマスファンクション(匿名関数)はインラインで定義され、主に使い捨てのファンクションが必要な場面で利用されます。

以下は、アノニマスファンクションをコールバックとして渡す例です。

3.1 実装例

PHPの array_map() ファンクションのコールバックとしてアノニマスファンクションを使用します。

<?php
$numbers = [1, 2, 3, 4, 5];
// インラインでファンクションを定義して渡す
$res = array_map(function($n) {return($n * $n);}, $numbers);
print_r($res);
?>

4. ユーザー定義ファンクションにおけるPHPコールバック

ユーザー定義のファンクションやメソッドも、コールバックファンクションをアーギュメントとして受け取ることができます。ユーザー定義ファンクションの内部でコールバックを実行するには、ヴァリアブル(変数)に括弧 () を付け、通常のファンクションと同様にアーギュメントを渡して呼び出します。

4.1 実装例

ユーザー定義ファンクションからコールバックを実行する例です。

<?php
// 感嘆符を付けるファンクション
function exclaim($str) {
  return $str . "! ";
}

// 疑問符を付けるファンクション
function ask($str) {
  return $str . "? ";
}

// フォーマットを適用して出力するファンクション
function printFormatted($str, $format) {
  // $format ヴァリアブルをファンクションとして実行
  echo $format($str);
}

// "exclaim" と "ask" をコールバックファンクションとして printFormatted() に渡す
printFormatted("Hello world", "exclaim");
printFormatted("Hello world", "ask");
?>