在我查看PHP源代码以查找已弃用的调用时间引用时,我在第三方代码中发现了以下两件事:
#1
$x = array(&$this, $a, $b);
#2
&$this->foo();
我知道&
用于标记引用。但这对我没有意义。
重新开始。 #1:当我使用array($this)
时,数组中是否也没有保存引用?
重新开始。 #2:当我调用自己实例的foo()时,为什么需要使用$this
作为参考?
答案 0 :(得分:3)
我想这段代码来自PHP4时间。
#1 - 在PHP 4中使用array($this)
表示与PHP 5中的array(clone($this))
相同,即您获得对象的副本。在大多数情况下,您希望获得相同的对象,而不是它的副本。所以我想原作者正是因为这个原因使用了array(&$this)
。
#2在手册的Returning References章节中解释
在这种情况下,如果它是&$this
或某些&$obj
并不重要。实际上,引用适用于从foo()
返回的值。例如,如果foo()
内部有一个大的static $cache
对象并返回其中的一部分,这可能是有意义的。 E.g。
class MyClass {
function &foo($id){
static $cache;
if (!isset($cache[$id])) {
$cache[$id] = extract_some_object_from_database($id);
}
return $cache[$id];
}
}
注意“& foo”
答案 1 :(得分:1)
这实际上是PHP
中通过引用传递的解决方法我们参考了PHP手册http://php.net/manual/en/language.references.pass.php
中的用法答案 2 :(得分:1)
因为@ cs1193通过引用传递当前对象。但现在没有意义,因为默认情况下对象是通过引用传递的。所以你创建引用的引用。
$x = array(&$this, $a, $b); // this would be passing reference to reference on current object.
&$this->foo(); //makes pretty no sense. $this is already reference to current object.
在第二个示例中,您需要通过$ this调用方法,因为PHP不知道您是否要调用类方法或函数。
答案 3 :(得分:1)
您可以通过按值传递或通过引用传递值来传递函数。在传递中,可以在内存中创建可变的新副本,其中只需要复制内存地址。在php&是指通过引用传递。