我似乎得不到任何关于这方面的一致信息。不同的来源似乎说了不同的事情,古老的php.net本身(似乎)没有明确地说明这一点-尽管,我必须承认,我只是快速地看了一眼。
在我传递“重”对象的情况下,我需要通过引用传递,但我不想一直输入:
function foo(TypeName& $obj)
如果我能用简单的
function foo(TypeName $obj)
那么标准是怎么说的呢?
发布于 2012-08-08 21:34:07
这不同于仅仅传递一个引用。
在http://www.php.net/manual/en/language.oop5.references.php上,列出的示例很不错。在第一个集合中,$a = NULL;不会影响$b,因为$a只是一个指针。在第二个集合中,$c = NULL;会导致$d也为NULL,因为$d是对$c的引用。
<?php
class A {
public $foo = 1;
}
$a = new A;
$b = $a;
$a->foo = 2;
$a = NULL;
echo $b->foo."\n"; // 2
$c = new A;
$d = &$c;
$c->foo = 2;
$c = NULL;
echo $d->foo."\n"; // Notice: Trying to get property of non-object...
?>
发布于 2010-04-27 00:21:44
从PHP5开始,所有的对象都是通过引用传递和赋值的。
在PHP4中,您仍然需要通过显式地使用&
操作符来指定希望通过引用传递对象的位置。
发布于 2014-10-31 02:58:44
这只是一个通过引用传递“对象”很有用的例子:
class RefTest1
{
public $foo;
public function __construct(RefTest2 &$ref = null)
{
$this->foo =& $ref;
}
}
class RefTest2
{
public $foo;
public function __construct(RefTest1 &$ref = null)
{
$this->foo =& $ref;
}
}
class RefTest3
{
public $foo;
public function __construct(RefTest2 &$ref = null)
{
$this->foo =& $ref;
}
}
class DoCrossRef
{
public $refTest1;
public $refTest2;
public function __construct()
{
$this->refTest1 = new RefTest1($this->refTest2);
$this->refTest2 = new RefTest2($this->refTest1);
}
public function changeReference()
{
$this->refTest1 = new RefTest3($this->refTest2);
}
}
最后,RefTest1
保存对RefTest2
的引用,反之亦然,如果在创建RefTest1
时RefTest2
对象还不存在。
在调用DoCrossRef->changeReference()
之后,RefTest2
对象还保存了对新RefTest3
对象的引用。
https://stackoverflow.com/questions/2715026
复制相似问题