首页 » PHP和MySQL Web开发(原书第4版) » PHP和MySQL Web开发(原书第4版)全文在线阅读

《PHP和MySQL Web开发(原书第4版)》5.8 参数的引用传递和值传递

关灯直达底部

如果希望编写一个名为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/>';