为什么Symfony2中没有使用引用运算符?

时间:2014-07-11 06:59:43

标签: php symfony reference frameworks

我用PHP编程了很长一段时间。最近我决定尝试使用一个框架。我碰巧选择了Symfony2。我注意到的第一件事是我从未遇到任何引用运算符(&)。我在之前的项目中经常使用它们。

我在php.net/manual/..上找到了这个。

  

请注意,在PHP5中,在处理类对象时通常不需要引用运算符,因为PHP5使用Instances实现对象(更像是C指针而不是PHP的引用系统)。

框架中的引用是不常见的,或者通常在PHP5中引用?

修改

我知道哪些引用以及它们如何工作。我想知道为什么网站上的Symfony2示例不会在任何地方使用引用运算符。

2 个答案:

答案 0 :(得分:4)

事实上,如果你使用传递对象作为函数的参数,PHP不会创建对象的副本,但是简单指向存在此对象的内存中的相同位置。因此,只要您不想做一些复杂的事情(指向内存中的另一个对象/变量),就不需要使用引用。

您应该在PHP手册中查看Object and references

您还可以考虑以下代码:

<?php


class A {
    public $x= 20;
}


$a = new A();

echo $a->x."<br />";
change($a);
echo $a->x."<br />";

changeRef($a);

echo $a->x."<br />"; // you get notice in this line. $a is no longer A object
echo $a."<br />";



function change(A $b) {
    $b->x = 10;
    $b = 15;   
}


function changeRef(A &$b) {
    $b->x = 10;
    $b = 15;   
}

我创建了2个功能更改(没有参考)和 changeRef (带参考)。

正如您在使用更改功能时所看到的那样,即使我们不使用引用,当在函数内使用属性赋值时,变量$a的属性也已更改 - 因为{{1} }和$a 指向内存中的相同位置。但是,如果在同一个函数中我将任何其他对象(在本例中为简单的int)设置为变量$b,则不会发生任何其他事情。简单$b现在指向内存中放置$b的其他位置,但15指向内存中与之前相同的位置。

然而,在分配$a$b后的发送功能(带参考)中,这意味着15也被分配了相同的值( $ b是对$ a的引用)所以当您尝试显示$a的属性后运行此函数时,不再可能(警告已提出),因为$a不再是$a而是简单int A object值。

我希望这会让你清楚这个问题,现在你明白了为什么在使用对象时不需要经常使用引用。

修改

正如您提到的使用数组引用,PHP使用 copy-on-write 机制。因此,如果您将数组传递给函数或其他变量,只要您不修改它,即使将数组作为参数传递,也不会创建副本。

请考虑以下代码:

15

在上述情况下,不会创建 $arr = [1,2,3]; show($arr); function show($a) { foreach ($a as $item) { echo $item; } } 的副本,因此在这种情况下不需要使用引用。因此,如果您不必修改阵列,则不必使用参考,从而坚定不移。可能这就是为什么Symfony在这种情况下不使用引用的原因。

此外,引用使代码不太清晰,因为如果您没有进入功能声明,您就不会知道它可以修改您的数据。因此,这可能是他们不那么常用的额外原因。

答案 1 :(得分:0)

Passing by Reference

  

注意:函数调用上没有引用符号 - 仅限于函数定义。单独的函数定义足以通过引用正确传递参数。从PHP 5.3.0开始,当您使用&amp;时,您将收到一条警告,指出“call-time pass-by-reference”已被弃用。在foo(&amp; $ a);.从PHP 5.4.0开始,删除了调用时传递引用,因此使用它会引发致命错误。