PHP で関数を受け取る関数にインスタンスメソッドを渡す方法

PHP の関数型スタイルの関数 array_map()array_filter() の引数に通常の関数ではなくメソッドを渡す方法をご紹介したいと思います。

PHP では array(インスタンス, メソッド名を表す文字列) でインスタンスメソッドを指定することができるので、このスタイルでメソッドを渡せば OK です。

class People {
  function __construct($name) {
    $this->name = $name;
  }

  function flush_messages($messages) {
    // コールバックとして関数ではなくインスタンスメソッドを使う
    // array(インスタンス, メソッド名を表す文字列) で OK 
    $lines = array_map(array($this, 'wrap_comment'), $messages);

    foreach ($lines as $line) {
      print $line;
    }
  }

  function wrap_comment($message) {
    return $this->name . ': ' . $message . PHP_EOL;
  }
}


$p1 = new People('Baku');

$messages = array('「この味がいいね」と', '君が言ったから', '七月六日は「サラダ記念日」');
$p1->flush_messages($messages);
// => Baku: 「この味がいいね」と
// => Baku: 君が言ったから
// => Baku: 七月六日は「サラダ記念日」

PHP にはいろいろと気持ち悪いところもありますが、こういうこともちゃんとできるようになっているんですね。 勉強になります。