2011-09-25 56 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; 
} 

然後,您可以在其他函數中以類似的方式調用其中的任何一個函數,如果需要的話。