функция внутри функции в php: ошибка: не удается переопределить

У меня есть этот 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.

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

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

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

    Вы можете не только использовать его один раз; вы можете объявить его только один раз. Каждый раз, hoeveelzijner используется функция hoeveelhoeveel , объявляется функция 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(...) .

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

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

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

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

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

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

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

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