我已经阅读了有关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
列表中存储的原始对象。
答案 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
获得它的最简单方法是当你知道它们之间的区别:类,对象和实例。 (我现在更多地解释一下,但这只会让你更加困惑,因为我的英语不够准确,现在不够详细解释细节。)