我在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的情况下复制对象吗?
如果有人能解释我的确切含义,我将不胜感激。和标识符。
谢谢,Jimit
答案 0 :(得分: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
(上表主要用于说明目的,实际技术细节可能有所不同。)