如果希望编写一个名为increment的函数来增加一个变量的值,我们可能会按如下方式编写这个函数:
function increment($value,$amount=1){
$value=$value+$amount;
}
这段代码是没有用的。下面测试代码的输出结果是“10”。
$value=10;
increment($value);
echo$value;
$value的内容没有被修改。这要归因于作用域规则。这段代码将创建一个名为$value的变量,它的值是10。然后调用函数increment。当函数被调用时,它内部的变量$value被创建。它的值加上1,所以$value在函数内部的值为11,直到函数结束,接下来我们返回到调用它的代码。在这段代码中,变量$value是一个不同的变量,具有全局域,所以它的值没有变。
解决这个问题的一个办法是将函数内的$value声明为全局变量,但这意味着为了使用这个函数,要进行变量运算的变量需要被命名为$value。
通常,函数获取参数的方式是值传递。当传递一个参数的时候,一个新的并且包含该传入值的变量被创建。它是原来那个变量的副本。可以以任意的方式修改它,但函数外部原来变量的值是不会改变的(这是PHP内部所实现的一个微小的简化)。
更好的办法是使用引用传递。这里,在参数被传递给函数的时候,函数不会再创建一个新变量,而是函数获得一个原来变量的引用。这个引用有一个变量名称,它以美元符号开始,可以像另一个变量那样使用它。其区别在于它不是获得变量本身的值,而是指向原来的值。任何对该引用的修改都会影响到原始变量值。
可以通过在函数定义的参数名前加一个地址符(&)来指定参数的引用传递。在函数调用处不用修改。
前面的increment的例子就可以修改为引用传递参数,这样它就可以正常工作了。
function increment(&$value,$amount=1){
$value=$value+$amount;
}
现在,我们有了一个可运行的函数,而且可以任意给想要进行增量运算的变量命名。正如前面所提到过的,在函数的内外使用同样的名称会引起混淆,所以我们给主脚本变量一个新的名称。如下所示的测试代码在调用increment之前将显示10,调用之后会显示11。
$a=10;
echo$a.'<br/>';
increment($a);
echo$a.'<br/>';