我到处都是混合信号。

是否使用“&”号通过引用传递变量?

以下链接似乎告诉我它已被弃用,不再需要:
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/

10-13 08:38
查看更多