不同文章似乎在说不同的事情的原因是他们在谈论不同种类的逐一参考。
确定是否应通过参考传递参数的主要因素是函数签名本身,自PHP 4以来,其基本原理没有改变。请考虑此示例:
function foo( $by_value, &$by_reference ) { /* ... */ }
$a = 1; $b = 2;
foo( $a, $b );
在这里,外部变量 $a
正在按值传递给函数,好像被分配为 $by_value = $a;
- 更改为 $by_value
不会影响 $a
. 。变量 $b
但是正在通过 引用;就像表格的作业一样 $by_reference =& $b;
这意味着有两个名称引用了一个变量,而对一个名称的任何作业都将充当两者的作业。
如果您按值传递“普通”值(字符串,数字或数组),则仅将其值复制到新变量。 从PHP 5开始: :如果您按值传递对象,则会发生一些稍有不同的事情 - 复制的“值”只是指向同一对象的指针。这意味着如果 $a
是一个物体,你可以打电话 $by_value->some_property = 42;
和 $a->some_property
也会 42
. 。但是,如果您将一些新值分配给 $by_value
, ,仍然不会影响 $a
.
直到PHP 5.4, ,有一个 额外的 通过引用传递参数的方法,这是“强制”参考行为 在通话时间. 。这意味着你可以写 foo(&$a, &$b);
和“捕获”更改 $by_value
在 - 的里面 foo()
功能。依靠这通常是一个坏主意,因此被删除了。 (因为它打算在PHP 6中删除,它降落在5.4中,但该项目被无限期地持有,较小的变化降落在5.3和5.4中)。
最后,功能可以 返回 通过引用的变量(AS 在这里的手册中讨论)。这有点麻烦,因为它实际上需要您放置 &
在 二 位置:在函数声明的开头,要说 return
应表示“返回此变量参考”而不是“返回此值”;在调用它的代码中,将变量分配给该引用,而不仅仅是复制其值。这是一个愚蠢的示例,将参考参数与参考返回结合起来(这两个不必汇总,这只是一个示例):
function &bar(&$some_param) { return $some_param; }
$a = 1;
$b =& bar($a);
// $b and $a now point at the same variable, not just the same value
// it was passed into and out of a function, and assigned to a new variable,
// but all those operations were by reference
请注意,许多人错误地认为,通过引用通过变量会给他们带来性能好处,这通常是他们使用呼叫时间通过引用的唯一原因。实际上,这通常是错误的,因为Zend Engine PHP使用一种称为“ copy on Write”的技术留下多个变量,这些变量恰好具有相同的值指向相同的内存,即使它们没有被绑定为参考。实际上,参考分配一般 失败 这种优化是由于引擎跟踪哪些变量在写入验证状态的方式。