我到处都是混杂的信号。

我是否使用anmpersand来通过引用是否通过变量?

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

但是像这样的线程让我感到奇怪:
逐次逐次拒绝吗?
php和andsand

让我称我的问题为例。

如果我发挥功能,请使用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() 功能。依靠这通常是一个坏主意,因此被删除了。 (因为它打算在PHP 6中删除,它降落在5.4中,但该项目被无限期地持有,较小的变化降落在5.3和5.4中)。

最后,功能可以 返回 通过引用的变量(AS 在这里的手册中讨论)。这有点麻烦,因为它实际上需要您放置 & 位置:在函数声明的开头,要说 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

请注意,许多人错误地认为,通过引用通过变量会给他们带来性能好处,这通常是他们使用呼叫时间通过引用的唯一原因。实际上,这通常是错误的,因为Zend Engine PHP使用一种称为“ copy on Write”的技术留下多个变量,这些变量恰好具有相同的值指向相同的内存,即使它们没有被绑定为参考。实际上,参考分配一般 失败 这种优化是由于引擎跟踪哪些变量在写入验证状态的方式。

其他提示

不它不是。

  • 对象总是自动传递为参考(信息! 有关其他重要信息,请参见下文!)

  • 将参数声明为引用必须在函数定义上发生:

    function test(&$var) {}
    

    不是 在打电话时:

    // wrong
    $var = '123';
    test(&$var);
    


如果像往常一样传递对象,则可以更改对象的状态(属性)。
假使,假设 $obj 是类的实例 TestClass 其中包含一个名为的成员变量 hello (单击此处以获取完整的示例):

function modify($obj) { $obj->hello = 'world (modified)!'; }

$obj->hello = 'world';
modify($obj);
var_dump($obj->hello);  // outputs "world (modified!)"

这应该是不言自明的。现在,使用相同的代码,但将另一个值分配给 $obj 而不是修改对象的状态无需修改(→ideone.com):

function modify($obj) { $obj = 42; }
// ...
var_dump($obj->hello);  // outputs "world"

仅明确接受参数作为参考,才能使我们能够完全更改变量的内容(→ideone.com):

function modify(&$obj) { $obj = 42; }
// ...
var_dump($obj);         // outputs "42"

不,这些不一样。 PHP 5.4+仅通过检查声明来调用函数时是否需要参考。

因此,不,不弃用,因为您需要在函数声明中的参考操作员,如果您的意图使用情况。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top