2011-09-25 86 views
7

我有这个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.

任何人都知道我在做什么错?它有点破坏了使用函数的目的,如果我只能使用它一次...

额外信息:我不包括任何其他文件,也不会在脚本中的其他位置重新声明函数。

非常感谢!

+1

看到这个:http://stackoverflow.com/questions/1398801/php-function-inside-a-function-good-or-bad –

回答

12

您不仅可以使用它一次;你只能宣布它一次。每次使用功能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

感谢您的优秀帖子。我也在为此而苦苦挣扎,唯一能找到的解决方案是[this](http://www.php.net/manual/en/language.functions.php#21150),它在php上获得了负面评价。净。现在我明白了为什么:) – EleventyOne

0

虽然PHP让你在任何地方声明一个函数,但我认为你所做的并不是最佳实践。

对于大多数人来说,它只是看起来错了。

你应该只在父函数之外声明函数。

或者你可以在内部函数周围添加一个function_exists(),虽然我只是在父函数之外声明内部函数。

甚至可能为它做一个类。

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

然后,您可以在其他函数中以类似的方式调用其中的任何一个函数,如果需要的话。