2011-09-25 14 views
7

ho questo script php:Funzione in php all'interno: Errore: Impossibile ridichiarare

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

Quando ho messo questo sotto di esso, funziona bene:

$values = hoeveelzijner(2005, 1); 

Tuttavia, quando lo faccio due volte, per esempio:

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

ottengo questo errore: errore irreversibile: Impossibile ridichiarare hoeveelhoeveel() (precedentemente dichiarato in ...: 69) in ... on line 69.

Qualcuno sa cosa sto facendo male? Distrugge lo scopo dell'uso delle funzioni se posso usarlo solo una volta ...

Ulteriori informazioni: Non includo altri file, né posso ridichiarare la funzione da qualche altra parte nello script.

Grazie mille!

+1

Vedere questo: http://stackoverflow.com/questions/1398801/php-function-inside-a-function-good-or-bad –

risposta

12

Non è possibile solo utilizzare una volta; è possibile solo dichiarare una volta. Ogni volta che viene utilizzata la funzione hoeveelzijner, viene dichiarata la funzione hoeveelhoeveel. Se la chiami più di una volta, la ridicherai, che è vietata.

Sono disponibili due opzioni: la prima consiste nel prendere la definizione della funzione all'esterno della funzione di contenimento. La funzione verrà dichiarata quando il file viene analizzato per la prima volta, quindi utilizzato ripetutamente. Se si desidera limitare la definizione di funzione per un determinato ambito (una buona idea in linea di principio), è possibile utilizzare la sintassi di funzione anonima introdotta in 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 
} 

È quindi possibile utilizzare la funzione come $hoeveelhoeveel(...).

+0

Grazie per l'eccellente post. Anch'io stavo lottando con questo, e l'unica soluzione che ho trovato era [questo] (http://www.php.net/manual/en/language.functions.php#21150), che ha ricevuto una valutazione negativa su php .netto. E ora capisco perché :) – EleventyOne

0

Sebbene PHP dichiariamo una funzione ovunque, penso che quello che stai facendo non sia considerato una buona pratica.

Per la maggior parte delle persone sembra semplicemente sbagliato.

È necessario dichiarare la funzione al di fuori della funzione genitore.

In alternativa è possibile aggiungere uno function_exists() attorno alla funzione interna, anche se di nuovo dichiarerei semplicemente la funzione interna esterna alla funzione genitore.

Sono forse persino in grado di fare una lezione per questo.

0

Non è possibile dichiararlo di nuovo, soprattutto se la funzione lo chiama più di una volta. Ecco una semplice modifica che dovrebbe funzionare.

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

Quindi è possibile chiamare una delle due funzioni in modo simile anche in altre funzioni, se necessario.

Problemi correlati