我到处都是混合信号。
是否使用“&”号通过引用传递变量?
以下链接似乎告诉我它已被弃用,不再需要:
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);
函数中编写$by_value
并对foo()
进行“捕获”更改。依赖于此通常是一个坏主意,因此将其删除。 (它降落在5.4中,因为它打算在PHP 6中删除,但是该项目被无限期搁置,而较小的更改降落在5.3和5.4中)。最后,函数可以通过引用返回变量(如discussed in the manual here)。这有点奇怪,因为实际上它要求您将
&
放在两个位置:在函数声明的开始,说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
请注意,许多人错误地认为通过引用传递变量会给他们带来性能上的好处,而这通常是他们使用调用时按引用传递的唯一原因。实际上,通常这是错误的,因为为PHP提供支持的Zend引擎使用一种称为“写时复制”的技术来保留多个变量,这些变量恰好具有指向同一块内存的相同值,即使它们没有被绑定(bind)在一起也是如此。引用。实际上,由于引擎跟踪哪些变量处于“写时复制”状态,因此引用分配通常不利于这种优化。
关于php - 我是否需要在PHP 5.5.X及更高版本中使用&符号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19847781/