1

更新:在

http://php.net/manual/en/language.oop5.references.php

它说:

常被提及的 PHP5 OOP 的关键点之一是“对象默认通过引用传递”。这并不完全正确。

这是为什么?以下是我不知道是否完全正确的原因:

我认为松散地说,foo 可以说是一个对象,或者类 Foo 的一个实例。

但是从技术上讲,foo 只是一个引用,这在 Java 和 Ruby 中的方式完全相同,其中变量foo始终只是对对象的引用,这是真的吗?

这就是为什么在 PHP 中,

function add($obj) {
  $obj->a++;
}

我们没有说“通过引用传递”,但从技术上讲,我们是在传递一个值,这是一个引用。因此,它是“通过引用”,而不是“通过引用”。

但是,如果我们在 PHP 中说 foo 是一个对象,那么我想“通过引用传递”是有道理的。这是真的吗?foo 据说是对对象的引用,而不是对象,所以这就是为什么我们只是“按值传递”?

4

3 回答 3

1

$foo不是一个对象,它是一个引用。说$foo是对象是错误的,$foo是指向对象的引用。

引用是按值传递的,就像 PHP(Java 和 Ruby)中的任何其他参数一样,因此您不能直接分配引用来修改它,但是您可以在它指向的对象上进行任何操作。

为了简化抽象,程序员有时会说“$foo是一个对象”,这是错误的,但比说整个“$foo是指向对象的引用”容易。在许多情况下,差异实际上并不重要,除非在某些边缘情况下。

于 2010-10-18T10:57:42.743 回答
0

PHP 对象变量实际上并不包含一个对象(就像在许多其他语言中一样)——它包含一个对象的“句柄”——即一些允许识别、查找和操作对象的值。这个变量像其他任何变量一样被传递——它可以通过val、by-ref等传递。但是,如果你将此值复制到另一个变量,事情的发生与整数或字符串发生的事情既相同又不同。

Integer/String:值被复制,所以当它被修改时,另一个保持不变。

对象:值被复制,但该值是一个句柄。因此,如果此句柄用于访问实际对象(这几乎是使用此句柄的唯一方法)并且此访问修改了它,那么另一个变量 - 独立但包含相同的句柄 - 将反映更改。

所以它实际上是非常一致的,只是有点不像你期望的那样天真地对待“按值”和“按引用”——因为对于标量和对象变量,传递的内容实际上是不同的。对象变量包括一个间接级别。

顺便说一句,这就是为什么通过引用传递对象变量几乎没有意义的原因——除非你想在函数中用另一个对象替换一个对象。

于 2010-11-26T23:02:13.673 回答
0

在 PHP 5+ 中,所有对象都默认通过引用传递,在 PHP 5 通过引用传递之前,您使用“&”运算符

这意味着如果将对象传递给方法,则引用将被复制,并且方法内的另一个变量将包含引用的副本。

因此,您不会默认通过引用传递引用:),因此您不能为包含引用副本的变量分配新值并影响原始引用。

于 2010-10-18T10:40:12.730 回答