在递归函数中命名变量

时间:2014-09-03 08:42:40

标签: php function naming-conventions

我的递归函数接收变量$a作为参数,记忆作为$b,然后传递它本身。

问题:

如果我递归调用一个函数,我传递给递归调用的变量(函数的第4行)是否与记忆变量(函数的第1行)具有相同的名称?

示例1

$a = "bob";

function do_someting($b)
{
    echo $b;
    if ($b == 'bob') {
        do_something($b);
    }
}

do_something($a);

或者我必须传递一个名称不同的变量(此函数的第4行和第5行)?

示例2

function do_someting($b)
{
    echo $b;
    if ($b == 'bob') {
        $c = $b;
        do_something($c);
    }
}

这里给出的函数将导致无限循环。这不是我真正的代码,只是举例说明我的问题。 不要运行它。

4 个答案:

答案 0 :(得分:2)

示例1运行正常。当你传递$ b时,接收函数只收到$ b的副本,因此当接收函数修改它时,它不会影响原来的$ b。

答案 1 :(得分:0)

您可以毫无问题地使用Example1。

变量$b在您的函数范围内,因此它在函数中的任何位置都可用。

由于你再次调用你的函数,你可以想到一个新的实例(即使在技术上instance也不是正确的词来描述它我猜,但是为了解释它的工作原理)是创建的从那个功能。这个实例并不知道他收到的$b是相同的,并且命名与之前的实例相同。

另外,因为你没有通过引用粘贴它们,在一个函数调用中对$b的任何更改都不会改变其他调用中的任何内容,但是在将从函数调用的调用中您在哪里更改了$b。那么这意味着如果你在每个参考文献中给出它们$a将在最后改变。

答案 2 :(得分:0)

不,您不必使用其他名称传递变量。 变量$b“生活在函数内部。所以如果再次调用该函数

答案 3 :(得分:0)

查看变量范围:PHP manual

在函数内部,您可以在范围内重用变量名称,范围是函数的起始端。如果以递归方式调用函数,则内部范围不会影响外部范围。

考虑功能:

function decrements($b) {
   print "pre call $b={$b}\n\r";
   if($b>0) decrements(--$b);
   print "post call $b={$b}\n\r";
}

decrements(4);

输出将是:

pre call 4=4
pre call 3=3
pre call 2=2
pre call 1=1
pre call 0=0
post call 0=0
post call 0=0
post call 1=1
post call 2=2
post call 3=3

如果您插入$ b = 4

decrements($b) { //$b = 4
  decrements($b) { //$b = 3
    decrements($b) { //$b = 2
      decrements($b) { //$b = 1
        decrements($b) { //$b = 0
        } //$b = 0
      } //$b = 0
    } //$b = 1
  } //$b = 2
} //$b = 3