0

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

如果我有如下课程:

class Item
{
    public $value;
}

然后我在一个变量中有一个这些项目的数组 - 让我们称之为 $items。我所做的只是 new Item()...和 ​​$items[] = $newItem;。

现在,我想填充另一个数组,但它会根据其值过滤原始数组。所以像下面这样:

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

现在,我有另一个变量迭代该过滤列表并执行以下操作:

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

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

4

2 回答 2

4

在 PHP 5 中,对象总是通过它们的“句柄”传递,因为没有更好的词。这意味着如果你这样做:

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

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

echo $a->value;

回显 2 的值。为什么?因为对象的句柄是从$ato复制的,$b并且它们都指向同一个对象。这不是 using 方面的参考&,但其行为非常相似,以至于人们通常称它为同一事物......即使它不是。

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

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

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

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

这会导致NULL,如果没有参考就不会发生。但同样,这不是典型的用法,所以你真的可以忘记对对象使用引用。

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

于 2013-08-11T21:22:37.920 回答
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

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

于 2013-08-11T21:04:20.167 回答