function inside function in php: error: Cannot redeclare [duplicate]
I have this php script:
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_mont开发者_StackOverflow中文版h(CAL_GREGORIAN,$i,$jaar),$jaar),$id);
$i = $i+1;
}
return $hoeveel;
}
When I put this beneath it, it works just fine:
$values = hoeveelzijner(2005, 1);
However, when I do it twice, for example:
$values = hoeveelzijner(2005, 1);
$test = hoeveelzijner(2000, 4);
I get this error: Fatal error: Cannot redeclare hoeveelhoeveel() (previously declared in ...:69) in ... on line 69.
Anyone knows what I am doing wrong? It kinda destroys the purpose of using functions if I can only use it once...
Extra info: I do not include any other files, nor do I redeclare the function somewhere else in the script.
Thanks a lot!
You can't only use it once; you can only declare it once. Every time the function hoeveelzijner
is used, the function hoeveelhoeveel
is declared. If you call it more than once, you'll redeclare it, which is forbidden.
You have two options: the first is to take the function definition outside the containing function. The function will be declared when the file is first parsed, then used repeatedly. If you want to restrict the function definition to a particular scope (a good idea in principle), you can use the anonymous function syntax introduced 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
}
You can then use the function as $hoeveelhoeveel(...)
.
Although PHP let's you declare a function anywhere I think what you are doing is not considered best practice.
For most people it just look wrong.
You should just declare the function outside the parent function.
Alternatively you could add a function_exists()
around the inner function, although again I would just declare the inner function outside the parent function.
Are perhaps even make a class for it.
You can't declare it again, especially if the function calls it more than once. Here's a simple change that should work.
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;
}
Then you can call either function in a similar way in other functions too, if needed be.
精彩评论