【问题标题】:Objects and references in php 5php 5 中的对象和引用
【发布时间】:2013-10-30 10:54:18
【问题描述】:

我在 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 的确切含义,我将不胜感激。和标识符。

谢谢,吉米特

【问题讨论】:

  • 引用与arrayinteger 和其他非类的php 类型一起显式使用,因为它们在函数调用中使用时会被复制。
  • afaik 对象标识符是引用。例如,在 java 中,引用/标识符是一个 16 字符长的字母数字值。
  • 我认为这些例子的意思是在 php 中通过引用传递参数是默认的。如果不是这样,那么在第一个和第三个示例中,您会看到 1 i/o 2。
  • @Ashalynd 通过引用传递和作为对象标识符的值是有区别的!

标签: php php-5.3


【解决方案1】:
$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

变量引用 (&amp;) 的工作方式与以往一样,您可以让两个变量引用相同的值。更改任何一个变量都会更改两个变量,它们或多或少地联系在一起。

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

对象标识符实际上是一个标识对象的东西。这是一个类似于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

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

【讨论】:

  • 非常感谢@deceze。我完全理解。
猜你喜欢
  • 1970-01-01
  • 2012-03-09
  • 2023-04-04
  • 2023-03-21
  • 1970-01-01
  • 2011-02-09
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多