JavaScriptには、arguments.calleeという、自分自身を再帰的に呼び出すプロパティがあります。arguments.calleeを使うと、以下のようなコードが書けます。
これと同じ事をPHPでやってみたのが、以下のコードです。
callee54()の方は、PHP5.4以上で利用できる、関数の返り値を配列として扱う記法を利用しています(参考:PHP5.4の新機能)。
なお、ここで定義したcallee()関数は、引数を1つ受け取る場合にしか対応していません。実用的なcallee()関数定義は、@anatooさんのブログ記事を参照して下さい。
function factorial(n) { if (n > 1) { return n * arguments.callee(n - 1); // 自分自身(factorial()を呼び出し) } return 1; } console.log(factorial(5)); // 120arguments.calleeの部分で自分自身を明示的に呼び出すように書いても、出力は同じです。しかし、arguments.calleeを使えば、関数名を変更した際などに再帰呼び出しの箇所を変更する必要がありません。また、無名関数内で再帰呼び出しをする際には、arguments.calleeを使う必要があります。
これと同じ事をPHPでやってみたのが、以下のコードです。
function callee($arg) { $backtrace = debug_backtrace(); return $backtrace[1]['function']($arg); } function callee54($arg) { $backtrace = debug_backtrace()[1]['function']; // PHP5.4以上ならこの書き方でもOK return $backtrace($arg); } function factorial($n) { if ($n > 1) { return $n * callee($n - 1); } return 1; } echo factorial(5); // 120debug_backtrace()を実行すると、PHPの実行状況についてのログ(バックトレース)が入った配列が返ってきます。PHPでは、変数内に格納された関数名文字列にカッコ演算子をつけると、その名前の関数が呼び出されます。この場合は、$backtrace[1]['function']に'factorial'という文字列が格納されているため、$backtrace[1]['function']で、factorial()が呼び出されています。
callee54()の方は、PHP5.4以上で利用できる、関数の返り値を配列として扱う記法を利用しています(参考:PHP5.4の新機能)。
なお、ここで定義したcallee()関数は、引数を1つ受け取る場合にしか対応していません。実用的なcallee()関数定義は、@anatooさんのブログ記事を参照して下さい。
コメント
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。