PHP对象引用


PHP Object References?

我读过关于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列表中的原始对象。

在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,如果没有引用,这是不会发生的。但同样,这不是典型的用法,所以您可能会忘记对对象使用引用。

(当然,这里不需要使用函数来说明这一点,但这是你在"现实世界"中看到的最典型的地方。)

它是这样的:

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

最简单的方法是当你知道它们之间的区别时:类、对象和实例。(我会在这一点上解释更多,但这只会让你更加困惑,因为我的英语目前还不够准确,无法充分解释细节。)