PHP对象引用?

时间:2013-08-11 20:57:39

标签: php

我已经阅读了有关PHP变量引用的内容,但我不是100%,希望有人可以提供帮助。

如果我有类似以下的课程:

class Item
{
    public $value;
}

然后我在变量中有一个这样的项目数组 - 让我们调用$ items。我所做的只是新的Item()...和$ items [] = $ newItem;。

现在,我想填充另一个数组,但它根据其值过滤原始数组。如下所示:

foreach($items as $key => $value)
{
    $filteredItems[] = &value;
}

现在,我有一个可以迭代过滤列表的另一个变量,并执行类似的操作:

$theItem = $filteredItems[10];
$theItem->value = 100;

现在这是我感到困惑的地方。我是否需要将$theItem设置为&filteredItems[10];(引用),还是只知道数组中的值是引用类型,$ theItem也会成为对同一项的引用?我在最后一组$theItem->value = 100;之后更改了$items列表中存储的原始对象。

2 个答案:

答案 0 :(得分:4)

在PHP 5中,由于缺少更好的单词,对象总是被它们的“句柄”传递。这意味着如果你这样做:

$a = new Item();
$a->value = 1;

$b = $a;
$b->value++;

echo $a->value;

回显2的值。为什么?因为对象的句柄从$a复制到$b,并且它们都指向同一个对象。这不是使用&方面的参考,但表现得与人们通常称之为相同的东西相似......即使它不是。

因此,您不需要在代码中使用任何引用。通常在PHP中,在使用对象时永远不需要使用引用。

对于对象,如果你这样做,你真的只会注意到引用(为变量本身分配一个新值):

function foo(Item &$a)
{
  $a = null;
}

$b = new Item();
foo($b);
var_dump($b);

这导致NULL,如果没有引用,就不会发生这种情况。但同样,这不是典型用法,因此您可以真正忘记对对象使用引用。

(当然,这里没有必要使用函数来说明这一点,但这是你在“真实世界”中看到的最典型的地方。)

答案 1 :(得分:0)

就是这样:

foreach($items as $key => &$value) {
    $filteredItems[] = $value;
}

将原始实例放入不同范围的位置是放置&的位置。 功能相同:

function myFunction(&$variable) { }

示例:

<?php
class test {
    public $testVar;
    public function __construct() {
        $this->testVar = "1";
    }
}

function changeByReference(&$obj) {
    $obj->testVar = "2";
}

$instance = new test();
// Prints 1
echo $instance->testVar, PHP_EOL;  
changeByReference($instance);
// Prints 2
echo $instance->testVar, PHP_EOL;

在此处详细了解:http://php.net/manual/en/language.oop5.references.php

如果要复制实例,请使用clone - php.net/clone

获得它的最简单方法是当你知道它们之间的区别:类,对象和实例。 (我现在更多地解释一下,但这只会让你更加困惑,因为我的英语不够准确,现在不够详细解释细节。)