我正在尝试运行递归函数,但它无法正常运行。我的代码中没有看到任何错误,所以也许这对PHP来说是不可能的?
<?php
$herpNum = 0;
function herp() {
if ($herpNum == 22) {
echo "done";
} else {
$herpNum = $herpNum+1;
echo $herpNum."<br/>";
herp();
}
}
herp();
?>
当我运行它时,结果只是一个很长的列表1.
答案 0 :(得分:4)
因为$ herpNum与函数的范围不同,所以它在函数内创建一个新的$ herpNum,默认为0,然后加1。
您既可以将其作为争论传递,也可以将其作为全局变量。
$herpNum = 0;
function herp($herpNum) {
if ($herpNum == 22) {
echo "done";
} else {
$herpNum = $herpNum+1;
echo $herpNum."<br/>";
herp($herpNum);
}
}
herp($herpNum);
或
$herpNum = 0;
function herp() {
global $herpNum;
if ($herpNum == 22) {
echo "done";
} else {
$herpNum = $herpNum+1;
echo $herpNum."<br/>";
herp();
}
}
herp();
答案 1 :(得分:3)
这是因为你没有将参数$herpnum
传入函数。
<?php
$herpNum = 0;
function herp($herpNum) {
if ($herpNum == 22) {
echo "done";
} else {
$herpNum = $herpNum+1;
echo $herpNum."<br/>";
herp($herpNum);
}
}
herp($herpNum);
?>
那应该有用
答案 2 :(得分:2)
问题是,$herpNum
每次调用herp()
时都会重新定义为herp()
范围内的本地变量。这将导致递归循环,直到'最大函数嵌套级别'100'达到...'抛出错误。 (当您将php ini值'display_errors'设置为'On'时,您可以看到错误)
将上面的代码更改为:
$herpNum = 0;
function herp() {
global $herpNum;
if ($herpNum == 22) {
echo "done";
} else {
$herpNum = $herpNum+1;
echo $herpNum."<br/>";
herp();
}
}
herp();
请注意,如果$herpNum
仅由herp()
使用,则最好将其声明为herp()
内的静态变量。
function herp() {
static $herpNum = 0;
// ...
static关键字告诉PHP解释器它应该在第一次调用函数时初始化变量一次。这应该完全符合您的设计需求;)
答案 3 :(得分:0)
尝试:
$herpNum = 0;
function herp() {
global $herpNum;
if ($herpNum == 22) {
echo "done";
} else {
$herpNum = $herpNum+1;
echo $herpNum."<br/>";
herp();
}
}
herp();
但出于安全原因,不建议这样做。
以下是一个例子:
...
if( $admin == true ) {
echo 'yeah! You are the admin!';
}
...
如果$admin
被声明为全局且未经过正确验证,则只需输入http://mysite.com/?admin=true
即可使测试通过。
顺便说一句......对于递归,最好将“environment”(一个或多个参数)作为参数注入:
herp($herpNum=0); // if nothing is given, $herpNum is set to 0