我用PHP编程了很长一段时间。最近我决定尝试使用一个框架。我碰巧选择了Symfony2。我注意到的第一件事是我从未遇到任何引用运算符(&
)。我在之前的项目中经常使用它们。
我在php.net/manual/..上找到了这个。
请注意,在PHP5中,在处理类对象时通常不需要引用运算符,因为PHP5使用Instances实现对象(更像是C指针而不是PHP的引用系统)。
框架中的引用是不常见的,或者通常在PHP5中引用?
我知道哪些引用以及它们如何工作。我想知道为什么网站上的Symfony2示例不会在任何地方使用引用运算符。
答案 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)
注意:函数调用上没有引用符号 - 仅限于函数定义。单独的函数定义足以通过引用正确传递参数。从PHP 5.3.0开始,当您使用&amp;时,您将收到一条警告,指出“call-time pass-by-reference”已被弃用。在foo(&amp; $ a);.从PHP 5.4.0开始,删除了调用时传递引用,因此使用它会引发致命错误。