【发布时间】:2014-01-30 06:14:07
【问题描述】:
由于现在默认情况下对象是通过引用传递的,所以&$obj 是否有意义?
【问题讨论】:
-
在古老的 php 版本上运行 - 廉价/愚蠢的托管商提供的那种,愉快地运行魔术引号和注册全局变量...应该从轨道上删除的那种安装。跨度>
标签: php oop object reference php-internals
由于现在默认情况下对象是通过引用传递的,所以&$obj 是否有意义?
【问题讨论】:
标签: php oop object reference php-internals
对象使用不同的引用机制。 &$object 更多的是引用的引用。你无法真正将它们两者进行比较。
见Objects and references:
PHP 引用是一个别名,它允许两个不同的变量写入同一个值。从 PHP 5 开始,对象变量不再包含对象本身作为值。它只包含一个对象标识符,允许对象访问者找到实际对象。当一个对象通过参数发送、返回或分配给另一个变量时,不同的变量不是别名:它们持有标识符的副本,它指向同一个对象。
&$object 不是$object。我给你举个例子:
foreach ($objects as $object) {
if ($cond) {
$object = new Object(); // This won't affect $objects
}
}
foreach ($objects as &$object) {
if ($cond) {
$object = new Object(); // This will affect $objects
}
}
如果有道理,或者有需要,我不会回答这个问题。这些是基于意见的问题。没有对象上的& 引用绝对可以生活,就像完全没有对象一样。两种机制的存在是 PHP 向后兼容的结果。
【讨论】:
for ($objects as $key=>$value) { $objects[$key] = new Object(); } 更好吗?
$obj = &new MyClass 创建对象。如果你想在函数中修改一个对象,你必须通过引用传递它。
在某些情况下,您可以在函数名称前添加 &,以返回任何值作为引用。
要调用这些函数,我们需要在对象前面添加 &。
如果我们在对象前面添加 &,那么它将返回值作为引用,否则它只会返回该变量的副本。
class Fruit() {
protected $intOrderNum = 10;
public function &getOrderNum() {
return $this->intOrderNum;
}
}
class Fruitbox() {
public function TestFruit() {
$objFruit = new Fruit();
echo "Check fruit order num : " . $objFruit->getOrderNum(); // 10
$intOrderNumber = $objFruit->getOrderNum();
$intOrderNumber++;
echo "Check fruit order num : " . $objFruit->getOrderNum(); // 10
$intOrderNumber = &$objFruit->getOrderNum();
$intOrderNumber++;
echo "Check fruit order num : " . $objFruit->getOrderNum(); // 11
}
}
【讨论】: