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