>我正在尝试运行递归函数,但它无法正常工作。我在代码中没有看到任何错误,所以也许这在 PHP 中是不可能的?
<?php
$herpNum = 0;
function herp() {
if ($herpNum == 22) {
echo "done";
} else {
$herpNum = $herpNum+1;
echo $herpNum."<br/>";
herp();
}
}
herp();
?>
当我运行这个时,结果只是一个长列表 1。
因为$herpNum与函数不在同一范围内,所以它在函数内创建一个默认为 0 的新$herpNum,然后向其添加 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();
您没有将参数$herpnum
传递到函数中。
<?php
$herpNum = 0;
function herp($herpNum) {
if ($herpNum == 22) {
echo "done";
} else {
$herpNum = $herpNum+1;
echo $herpNum."<br/>";
herp($herpNum);
}
}
herp($herpNum);
?>
那应该有效
问题是,每次调用$herpNum
时,都会在herp()
范围内重新找到herp()
var。这将导致递归循环,直到达到"最大函数嵌套级别'100'......" 引发错误。(当您将 php ini 值"display_errors"设置为"开"时,您可以看到错误)
将上面的代码更改为:
$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 解释器,当第一次调用函数时,它应该只初始化变量一次。这应该完全符合您的设计需求;)
试试:
$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
即可使测试通过。
顺便一提。。。对于递归,最好注入"环境"(一个或多个参数)作为参数:
herp($herpNum=0); // if nothing is given, $herpNum is set to 0