tohokuaikiのチラシの裏

技術的ネタとか。

PHPの関数内で自己再帰呼び出し

できるかな?と思ってテスト…

<?php
function r($count)
{
    echo $count."\n";
    if ($count < 10) {
        r(++$count);
    }
}
r(1);

1
2
3
4
5
6
7
8
9
10

でも、関数名を変えると再帰呼び出ししてるところも変えないといけない。

__FUNCTION__を使う

関数内では、__FUNCTION__が関数名を示すので

<?php
function r($count)
{
    echo $count."\n";
    if ($count < 10) {
        __FUNCTION__(++$count);
    }
}

ってやった…Parse Error…ですよねー。

一旦変数にする。

<?php
function r($count)
{
    $f_name = __FUNCTION__;
    echo $count."\n";
    if ($count < 10) {
        $f_name(++$count);
    }
}

これはうまくいった。だけど…だけどですよねー。JavaScriptならarguments.callee使えるのになー。

(function(c){ 
    console.log(c++);
     if (c<10) {
        arguments.callee(c);
    }
})(1)

PHPのClosureは変数に入れてるしなー。ダメっぽいな。