функция внутри функции в php: error: невозможно переопределить - PullRequest
9 голосов
/ 25 сентября 2011

У меня есть этот скрипт 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);

Однако, когда я делаю это дважды, например:

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

Я получаю эту ошибку: Неустранимая ошибка: невозможно повторно объявить hoeveelhoeveel () (ранее объявленный в ...: 69) в ... в строке 69.

Кто-нибудь знает, что яя делаю не так?Это своего рода разрушает цель использования функций, если я могу использовать их только один раз ...

Дополнительная информация: я не включаю никакие другие файлы и не переопределяю функцию где-то еще в скрипте.

Большое спасибо!

Ответы [ 3 ]

15 голосов
/ 25 сентября 2011

Вы не можете только использовать один раз;Вы можете только объявить один раз.Каждый раз, когда используется функция hoeveelzijner, объявляется функция hoeveelhoeveel.Если вы вызываете его более одного раза, вы будете повторно его объявлять, что запрещено.

У вас есть два варианта: первый - вывести определение функции за пределы содержащей ее функции.Функция будет объявлена, когда файл сначала анализируется, а затем используется повторно.Если вы хотите ограничить определение функции определенной областью (хорошая идея в принципе), вы можете использовать синтаксис анонимной функции, введенный в 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(...).

0 голосов
/ 25 сентября 2011

Вы не можете объявить это снова, особенно если функция вызывает его более одного раза. Вот простое изменение, которое должно сработать.

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;
}

Затем вы можете вызывать любую функцию аналогичным образом и в других функциях, если необходимо.

0 голосов
/ 25 сентября 2011

Хотя PHP позволяет вам объявлять функцию где угодно, я думаю, что то, что вы делаете, не считается лучшей практикой.

Для большинства людей это выглядит просто неправильно.

Вы должны просто объявить функцию вне родительской функции.

В качестве альтернативы вы можете добавить function_exists() вокруг внутренней функции, хотя я бы просто объявил внутреннюю функцию вне родительской функции.

Возможно, даже сделать класс для него.

...