微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我是否需要在PHP 5.5.X及更高版本中使用&符号?

我到处都是混合信号.

我是否使用&符号通过引用传递变量?

以下链接似乎告诉我它已被弃用,不再需要:
http://gtk.php.net/manual/en/html/tutorials/tutorials.changes.references.html

但像这样的线程让我想知道:
Call-time pass-by-reference deprecated?
PHP and ampersand

让我以我的问题为例.

如果我使用PHP 5.5.5创建一个函数

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引擎使用一种称为“写入时复制”的技术来保留多个变量,这些变量恰好具有指向同一块内存的相同值,即使它们没有绑定为引用.事实上,由于引擎跟踪哪些变量处于写时复制状态,引用分配通常会使这种优化失败.

原文地址:https://www.jb51.cc/php/138782.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐