11

私はこのphpスクリプトを持っています:

function hoeveelzijner ($jaar, $id)
{
            function hoeveelhoeveel($beginstamp, $endstamp, $id)
            {
                $dates = mysql_query('SELECT v_date FROM visitors WHERE id="'.$id.'" AND v_date<"'.$endstamp.'" AND v_date>"'.$beginstamp.'"');
                return mysql_num_rows($dates);
            }
$i = 1;
while ($i < 13)
{
    $hoeveel[$i-1] = hoeveelhoeveel(mktime(0, 0, 0, $i, 1, $jaar),mktime(0, 0, 0, $i, cal_days_in_month(CAL_GREGORIAN,$i,$jaar),$jaar),$id);
    $i = $i+1;
}
return $hoeveel;
}

これを下に置くと、問題なく動作します。

$values = hoeveelzijner(2005, 1);

ただし、たとえば、2回行うと:

$values = hoeveelzijner(2005, 1);
$test = hoeveelzijner(2000, 4);

次のエラーが表示されます: Fatal error: Cannot redeclare hoeveelhoeveel() (previously defined in ...:69) in ... on line 69.

誰が私が間違っているのか知っていますか? 一度しか使えないと、関数を使う目的がぶち壊してしまうような……。

追加情報: 他のファイルを含めたり、スクリプトの他の場所で関数を再宣言したりしません。

どうもありがとう!

4

3 に答える 3

17

一度しか使えません。一度だけ宣言できます。hoeveelzijner関数が使用されるたびに、関数hoeveelhoeveelが宣言されます。複数回呼び出すと、再宣言されますが、これは禁止されています。

2 つのオプションがあります。1 つ目は、関数定義をそれを含む関数の外に置くことです。関数は、ファイルが最初に解析されるときに宣言され、その後繰り返し使用されます。関数定義を特定のスコープに制限したい場合 (原則として良い考えです)、PHP 5.3 で導入された無名関数構文を使用できます。

function hoeveelzigner($jaar, $id)
{
    $hoeveelhoeveel = function($beginstamp, $endstamp, $id)
    {
            $dates = mysql_query('SELECT v_date FROM visitors WHERE id="'.$id.'" AND v_date<"'.$endstamp.'" AND v_date>"'.$beginstamp.'"');
            return mysql_num_rows($dates);
    };

    // etc
}

その後、関数を として使用できます$hoeveelhoeveel(...)

于 2011-09-25T11:55:30.323 に答える
0

特に関数が複数回呼び出す場合は、再度宣言することはできません。動作するはずの簡単な変更を次に示します。

function hoeveelhoeveel($beginstamp, $endstamp, $id)

    $dates = mysql_query('SELECT v_date FROM visitors WHERE id="'.$id.'" AND v_date<"'.$endstamp.'" AND v_date>"'.$beginstamp.'"');
    return mysql_num_rows($dates);
}

function hoeveelzijner ($jaar, $id)
{
    $i = 1;
    while ($i < 13)
    {
        $hoeveel[$i-1] = hoeveelhoeveel(mktime(0, 0, 0, $i, 1, $jaar),mktime(0, 0, 0, $i, cal_days_in_month(CAL_GREGORIAN,$i,$jaar),$jaar),$id);
        $i = $i+1;
    }
    return $hoeveel;
}

次に、必要に応じて、他の関数でも同様の方法でいずれかの関数を呼び出すことができます。

于 2011-09-25T12:43:47.650 に答える
0

PHPではどこでも関数を宣言できますが、あなたがしていることはベストプラクティスとは見なされません。

ほとんどの人にとって、それは単に間違っているように見えます。

親関数の外側で関数を宣言するだけです。

または、内部関数の周りに a を追加することもできますがfunction_exists() 、ここでも親関数の外側で内部関数を宣言するだけです。

おそらくそれのためのクラスを作ることさえあります。

于 2011-09-25T11:55:48.753 に答える