PHPでのclosure

closure(無名関数)はPHP5.3から導入されました
参考 http://php.net/manual/ja/functions.anonymous.php

今回はその使いかたを簡単に書いときます

そもそも必要性として「一回しか使わない関数を定義しなくていい」「関数名を考える必要がない」だと自分は思っています。

まずはhello_world

<?php
$print = function($str){
    echo $str."\n";
};

$print("hello world");
?>

見ての通り変数に関数を入れてる感じですね

再帰処理にも使えます。
そのときに使いのがuseです。
useは親のスコープから変数を引継ぎをする時に使います。

階乗

<?php
$factorial = function($n)use( &$factorial){
    if($n == 1) return 1;
    else return $n * $factorial($n - 1);
};

echo $factorial(5)."\n";
?>

Fibonacci

<?php
$fib = function($n)use( &$fib){
    if($n <= 1) return $n;
    else return $fib($n - 1) + $fib($n - 2);
};

echo $fib(5)."\n";
?>


__invokeメゾット

newやメゾットが実行されても動かずにインスタンスから直接引数が与えられた時に実行するメゾット

<?php
class A{
    public function __invoke($str){
        echo $str."\n";
    }
};

$c = new A;
$c("hello");
?>

以上です