关于PHP参数的引用传递和值传递

 

若是但愿编写一个名为increment()的函数来增长一个变量的值,咱们可能会按以下方式编写这个函数:函数

这段代码是没有用的。下面测试代码的输出结果是“10”。测试

$value 的内容没有被修改。这要归因于做用域规则。这段代码将建立一个名为$value的变量,它的值是10。而后调用函数increment()。当函数被调用 时,它内部的变量$value被建立。它的值加上1,因此$value在函数内部的值为11,直到函数结束,接下来咱们返回到调用它的代码。在这段代码 中,变量$value是一个不一样的变量,具备全局域,因此它的值没有变。解决这个问题的一个办法是将函数内的$value声明为全局变量,但这意味着为了 使用这个函数,要进行变量运算的变量须要被命名为$value。blog

一般,函数获取参数的方式是值传递。当传递一个参数的时候,一个新的而且包含该传入值的变量被建立。它是原来那个变量的副本。能够以任意的方式修改它,但函数外部原来变量的值是不会改变的(这是PHP内部所实现的一个微小的简化)。作用域

更 好的办法是使用引用传递。这里,在参数被传递给函数的时候,函数不会再建立一个新变量,而是函数得到一个原来变量的引用。这个引用有一个变量名称,它以美 元符号开始,能够像另外一个变量那样使用它。其区别在于它不是得到变量自己的值,而是指向原来的值。任何对该引用的修改都会影响到原始变量值。rem

能够经过在函数定义的参数名前加一个地址符(&)来指定参数的引用传递。在函数调用处不用修改。it

前面的increment()的例子就能够修改成引用传递参数,这样它就能够正常工做了。class

如今,咱们有了一个可运行的函数,并且能够任意给想要进行增量运算的变量命名。正如前面所提到过的,在函数的内外使用一样的名称会引发混淆,因此咱们给主脚本变量一个新的名称。以下所示的测试代码在调用increment()以前将显示10,调用以后会显示11。变量

相关文章
相关标签/搜索