PHP对象引用?

PHP对象引用?,php,Php,我读过PHP变量引用,但我不是100%,希望有人能帮我 如果我有一个像下面这样的课程: class Item { public $value; } foreach($items as $key => $value) { $filteredItems[] = &value; } 然后,我在一个变量中有一个这些项的数组——让我们调用$items。我只做了newItem()…和$items[]=$newItem 现在,我想填充另一个数组,但它会根据其值过滤原始数组。因

我读过PHP变量引用,但我不是100%,希望有人能帮我

如果我有一个像下面这样的课程:

class Item
{
    public $value;
}
foreach($items as $key => $value)
{
    $filteredItems[] = &value;
}
然后,我在一个变量中有一个这些项的数组——让我们调用$items。我只做了newItem()…和$items[]=$newItem

现在,我想填充另一个数组,但它会根据其值过滤原始数组。因此,我们可以这样说:

class Item
{
    public $value;
}
foreach($items as $key => $value)
{
    $filteredItems[] = &value;
}
现在,我有另一个变量,它在过滤列表上进行迭代,并执行如下操作:

$theItem = $filteredItems[10];
$theItem->value = 100;
这就是我困惑的地方。我是否需要将
$item
设置为
&filteredItems[10](reference)或者它只知道数组中的值是引用类型,$ITEEM也会成为对该项的引用吗?我在寻找最后一组
$Iteem->value=100
更改存储在
$items
列表中的原始对象。

如下所示:

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;
是这样的:

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;

在PHP5中,由于缺少更好的单词,对象总是通过其“句柄”传递。这意味着如果您这样做:

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

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

echo $a->value;
2的值将被回显。为什么?因为对象的句柄是从
$a
复制到
$b
的,并且它们都指向同一个对象。就使用
&
而言,这不是一个参考,但其行为非常相似,以至于人们通常将其称为同一事物。。。即使不是

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

对于对象,如果执行此操作(为变量本身指定一个新值),您实际上只会注意到引用:

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


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

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

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

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

echo $a->value;
2的值将被回显。为什么?因为对象的句柄是从
$a
复制到
$b
的,并且它们都指向同一个对象。就使用
&
而言,这不是一个参考,但其行为非常相似,以至于人们通常将其称为同一事物。。。即使不是

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

对于对象,如果执行此操作(为变量本身指定一个新值),您实际上只会注意到引用:

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


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

对象实例始终保留并指定为引用,而不管
&
。如果要使筛选列表与原始对象列表保持不同,则必须克隆每个条目。@mario PHP 5 OOP中经常提到的一个要点是“默认情况下对象是通过引用传递的”。这并不完全正确。本节通过一些例子纠正了这一总体思路。从@ndm来看,该手册在解释差异方面做得相当差劲,但它不仅仅是技术性的:
$foo=newfoo(1)$bar=$foo$baz=&$foo$foo=新的foo(2)
导致
$foo
$baz
指向同一对象(因为它们作为引用链接),但
$bar
指向原始对象(其对象指针在赋值中被复制)@IMSoP您说得对。。。我应该说,即使它们不是通过引用传递的,它们也会指向同一个对象,因此不需要显式地通过引用传递。对象实例始终保留并指定为引用,而不管
&
。如果要使筛选列表与原始对象列表保持不同,则必须克隆每个条目。@mario PHP 5 OOP中经常提到的一个要点是“默认情况下对象是通过引用传递的”。这并不完全正确。本节通过一些例子纠正了这一总体思路。从@ndm来看,该手册在解释差异方面做得相当差劲,但它不仅仅是技术性的:
$foo=newfoo(1)$bar=$foo$baz=&$foo$foo=新的foo(2)
导致
$foo
$baz
指向同一对象(因为它们作为引用链接),但
$bar
指向原始对象(其对象指针在赋值中被复制)@IMSoP您说得对。。。我应该说,即使它们不是通过引用传递的,它们也会指向同一个对象,因此不需要显式地通过引用传递。在进一步广泛测试了在所有地方添加引用“&”符号并将其全部取出后,行为是相同的。感谢您的详细解释。经过进一步广泛测试,在所有地方添加引用“&”符号并将其全部删除后,行为是相同的。感谢您的详细解释。这是错误的:
changeByReference
函数始终采用对象,该对象将作为对象句柄传递,因此不需要通过引用传递。这是错误的:
changeByRefer