【发布时间】:2014-07-25 11:41:37
【问题描述】:
我有一个库类class someClass{....}。我为这个类创建了一个对象。
$objectA = someClass;
我想为$objectA 使用别名$objectB,因此我的课程更有意义。
PS:$objectB应该指向$objectA
【问题讨论】:
我有一个库类class someClass{....}。我为这个类创建了一个对象。
$objectA = someClass;
我想为$objectA 使用别名$objectB,因此我的课程更有意义。
PS:$objectB应该指向$objectA
【问题讨论】:
$objectB = $objectA;
来自the manual:
经常提到的 PHP 5 OOP 的一个关键点是 “对象默认通过引用传递”。这并不完全 真的。本节通过一些例子来纠正这种普遍的想法。
PHP 引用是一个别名,它允许两个不同的变量 写入相同的值。自 PHP 5 起,对象变量没有 不再包含对象本身作为值。它只包含一个对象 允许对象访问者找到实际对象的标识符。 当一个对象通过参数发送、返回或分配给另一个对象时 变量,不同的变量不是别名:它们持有 标识符,指向同一个对象。
<?php
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";
?>
上面的例子会输出:
2
2
2
【讨论】:
我喜欢约翰·康德的回答。我想添加以下内容(使其更直接):
在 PHP 中,几乎任何东西都可以“引用”。对于像我这样来自 C 和 ASM 技术编程的老手来说,它与“指针”的概念类似。
“指针”是内存中某物的物理位置的地址。通过了解它,您可以在不使用上下文中的变量的情况下引用该内容。
在 PHP 中,如果您在对象、结构或变量前面加上符号“&”,您就是在告诉解释器您想要的是内容的引用,而不是内容本身。当将它与另一个对象、结构或变量相关联时,PHP 解释器不会在另一个内存分配点复制它,而是将它引用到与原始内存位置相同的内存位置。主要是,你最终会得到两个指向 RAM 中相同位置的项目。
您可以像这样在 PHP 中引用变量、结构和对象:
$variable = "Variable Content";
$alias = &$variable;
echo $alias;
上面的代码应该打印Variable Content。
请注意$alias = &$variable; 与$alias = $variable; 不同(没有“&”)。在第一种情况下,PHP 会将$variable 的内容复制到$alias 中,并且您将在不同变量指向的RAM 的不同位置有两个相同的值。第二种情况,使用“&”,是单个内容,有两个独立的指针,但引用 RAM 中的相同位置。
与两个特定变量的情况类似,如果您取消设置其中任何一个($variable 或$alias),它不会取消设置引用,这意味着另一个将继续工作。但是,如果您修改任何内容,它会同时修改这两个变量的内容,因为它们在 RAM 中查找相同的物理位置以在使用时检索内容。
把它想象成类似于 Unix 的 unlink 调用。相同的规则适用于对象和结构。一切都可以参考。
而且,是的,您可以对同一个内容有多个引用。
如果您现在突然想到“垃圾回收”(GC) 的噩梦,那么您明白了。 :)
更多信息请访问https://www.php.net/manual/en/language.references.php
它们在概念上相似,仅在实现和语言模型方面有所不同:
引用 = 别名 = 指针
【讨论】: