【发布时间】:2011-06-12 03:11:21
【问题描述】:
例如,在 PHP 中我们可以这样写:
class C {
var $x;
function __construct($x) {
$this->x = $x;
}
function __toString() {
return (string)$this->x;
}
}
function f1($obj) {
$obj->x = 2;
}
$a = new C(1);
f1($a);
echo $a; // 2
有些人会说这表明对象是通过引用传递的,因为您可以修改它们的属性,并且这些更改会反映在类之外。即,对象不会像原语那样被复制。
但是我们可以这样写:
function f2($obj) {
$obj = new C(2);
}
$b = new C(1);
f2($b);
echo $b; // 1
这表明对象根本不是通过引用传递的。实际上,对象被复制(即,按值传递)但不是deep-复制的; $obj 被复制了,但 $x 仍然指的是同一个东西。
我听说“参考”这个词过去有两种意思;有人会说 PHP 是按引用传递,也有人会说是按值传递。
如果我们说 PHP 是通过引用传递的,那么定义一个类似的函数是什么意思
function f3(&$obj)
? 那个函数引用一个对象,这表明第一个意思是错误的。
但是对于像 C++ 这样的语言和 C# 中的结构呢?我的 C++ 有点生疏,但我相信整个类在传递它时实际上会被深度复制,这就是为什么鼓励你的函数尽可能使用引用或使用指针的原因。在 C# 中,结构和类的传递方式有所不同。
如果不是按值传递,你怎么称呼这种深度复制行为?
似乎我们有 3 种行为,只有两个短语来描述它们,这在社区中造成了很多混乱。
哎呀,我只是在等你们中的一个告诉我我在这里写错了。
总的来说,这三种行为是:
- 对象被深度复制(对象及其属性被克隆)
- 仅复制对象(其属性仍引用同一块内存)
- 对象根本没有被复制
从技术上讲,我们应该如何称呼这些行为?路过-???
【问题讨论】:
-
有一天(或者可能不会),PHP 将为参数实现
const关键字,这将消除任何歧义... :)
标签: php reference terminology