1

我在 php.net 手册中发现了以下几行,我无法理解他们到底想说什么。

“从 PHP 5 开始,对象变量不再包含对象本身作为值。它只包含一个对象标识符,允许对象访问者找到实际对象。当一个对象通过参数发送时,返回或分配给另一个变量,不同的变量不是别名:它们持有标识符的副本,它指向同一个对象。”

我不明白什么是差异。在 php5 中的引用和标识符之间。他们给出了下面的例子。

class A {
    public $foo = 1;
}  

$a = new A;
$b = $a;     // $a and $b are copies of the same identifier
             // ($a) = ($b) = <id>
$b->foo = 2;
echo $a->foo."\n";


$c = new A;
$d = &$c;    // $c and $d are references
             // ($c,$d) = <id>

$d->foo = 2;
echo $c->foo."\n";


$e = new A;

function foo($obj) {
    // ($obj) = ($e) = <id>
    $obj->foo = 2;
}

foo($e);
echo $e->foo."\n";

//Outputs 2 2 2

当我们应该使用 ref 时,它会给出相同的输出。我们应该复制没有引用的对象吗?

如果有人能解释一下 ref 的确切含义,我将不胜感激。和标识符。

谢谢,吉米特

4

1 回答 1

2
$a = new A;
$b = $a;
$b->foo = 'bar';  // changes the object that the identifier in $a and $b both refer to

$b = new B;       // overwrites $b with a new object identifier
$b->foo = 'baz';  // changes only $b's object

$a->foo // bar
$b->foo // baz

与之对比:

$a = new A;
$b = &$a;         // BIG DIFFERENCE HERE!
$b->foo = 'bar';  // changes the object that both $a and $b refer to

$b = new B;       // overwrites both $a and $b with a new object identifier
$b->foo = 'baz';

$a->foo // baz
$b->foo // baz

变量引用 ( &) 像它们一样工作,你让两个变量引用相同的值。改变任何一个变量都会改变两个变量,它们或多或少地联系在一起。

关于对象只是标识符的事情只是意味着如果您将一个对象复制到另一个变量($a = $b),两个变量都拥有相同的对象标识符。但是这两个变量的链接方式与使用&引用时不同。

对象标识符从字面上看就是标识对象的东西。这是一个像integer 42. 这是一个表示“我指的是对象#1”的值。实际对象本身存储在其他地方并在需要时获取。对象标识符是一级间接:

$a = 42;
$b = &$a;

这里两个变量指的是完全相同的值。在符号表中,它看起来像:

symbol | value
-------+------
a, b   | 42

但是对于对象标识符,它看起来像这样:

$a = new A;
$b = $a;

symbol | value             object   | details
-------+---------          ---------+--------
a      | object#1          object#1 | class A { ... }
b      | object#1

(以上表格主要用于说明目的,实际技术细节可能有所不同。)

于 2013-10-30T11:08:06.087 回答