Nat*_*man 8 php pass-by-reference ampersand
我到处都是混合信号.
我是否使用&符号通过引用传递变量?
以下链接似乎告诉我它已被弃用,不再需要:http:
//gtk.php.net/manual/en/html/tutorials/tutorials.changes.references.html
但像这样的线程让我想知道:
呼叫时间传递引用已被弃用?
PHP和&符号
让我以我的问题为例.
如果我使用PHP 5.5.5创建一个函数:
function recurring_mailer_form($form, $form_state)
{
}
Run Code Online (Sandbox Code Playgroud)
它是否相同:
function recurring_mailer_form($form, &$form_state)
{
}
Run Code Online (Sandbox Code Playgroud)
?
IMS*_*SoP 22
不同文章似乎在说不同的东西的原因是他们在谈论不同类型的传递参考.
确定参数是否应该通过引用传递的主要因素是函数签名本身,并且自PHP 4以来,其基本原理没有改变.考虑这个例子:
function foo( $by_value, &$by_reference ) { /* ... */ }
$a = 1; $b = 2;
foo( $a, $b );
Run Code Online (Sandbox Code Playgroud)
这里,外部变量$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()函数内部所做的更改.依赖于此通常是一个坏主意,因此它被删除.(它落在5.4中,因为它打算在PHP 6中删除,但该项目被无限期保留,较小的变化在5.3和5.4中着陆).
最后,函数可以通过引用返回变量(如本手册中所述).这是一个有点繁琐,因为它实际上需要你把&在2个地方:在函数声明的开头,说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
Run Code Online (Sandbox Code Playgroud)
请注意,许多人错误地认为通过引用传递变量会给他们带来性能优势,这通常是他们使用call-time pass-by-reference的唯一原因.这实际上通常是错误的,因为支持PHP的Zend引擎使用一种称为"写入时复制"的技术来保留多个变量,这些变量碰巧具有指向同一块内存的相同值,即使它们没有被绑定为引用.事实上,由于引擎跟踪哪些变量处于写时复制状态,引用分配通常会使这种优化失败.