我是否使用&符号通过引用传递变量?
以下链接似乎告诉我它已被弃用,不再需要:
http://gtk.php.net/manual/en/html/tutorials/tutorials.changes.references.html
但像这样的线程让我想知道:
Call-time pass-by-reference deprecated?
PHP and ampersand
让我以我的问题为例.
function recurring_mailer_form($form,$form_state) { }
它是否相同:
function recurring_mailer_form($form,&$form_state) { }
?
确定参数是否应该通过引用传递的主要因素是函数签名本身,并且自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);并在foo()函数内“捕获”对$by_value所做的更改.依靠这一点通常是一个坏主意,所以它被删除了. (它落在5.4中,因为它打算在PHP 6中删除,但该项目被无限期保留,较小的变化在5.3和5.4中着陆).
最后,函数可以通过引用返回变量(如discussed in the manual here).这有点繁琐,因为它实际上要求你把&在两个地方:在函数声明的开头,要说返回应该表示“返回此变量引用”而不是“返回此值”;并在调用它的代码中,为该引用分配一个变量,而不是仅仅复制它的值.这是一个愚蠢的例子,它结合了一个参考参数和一个引用返回(两个不必一起去,它只是一个例子):
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
请注意,许多人错误地认为通过引用传递变量将为他们带来性能优势,而这通常是他们使用call-time pass-by-reference的唯一原因.实际上这通常是错误的,因为支持PHP的Zend引擎使用一种称为“写入时复制”的技术来保留多个变量,这些变量恰好具有指向同一块内存的相同值,即使它们没有绑定为引用.事实上,由于引擎跟踪哪些变量处于写时复制状态,引用分配通常会使这种优化失败.