如何在PHP 5中通过引用传递对象?

Bri*_*ham 22 php variables object pass-by-reference

在PHP 5中,您是否需要使用&修饰符通过引用传递?例如,

class People() { }
$p = new People();
function one($a) { $a = null; }
function two(&$a) { $a = null; )
Run Code Online (Sandbox Code Playgroud)

在PHP4中,您需要&修改器在进行更改后维护引用,但是我对我读过的关于PHP5自动使用pass-by-reference的主题感到困惑,除非明确克隆对象.

在PHP5中,是否 & 需要通过引用传递所有类型的对象(变量,类,数组......)?

web*_*ave 82

你需要使用&modifier来传递引用吗?

从技术上/语义上来说,答案是肯定的,即使对象也是如此.这是因为有两种传递/分配对象的方法:通过引用或通过标识符.当函数声明包含一个时&,如:

function func(&$obj) {}
Run Code Online (Sandbox Code Playgroud)

无论如何,论证都将通过引用传递.如果你宣布没有&

function func($obj) {}
Run Code Online (Sandbox Code Playgroud)

除了对象和资源之外,所有内容都将按值传递,然后通过标识符传递.什么是标识符?好吧,您可以将其视为参考的参考.请看以下示例:

class A
{
    public $v = 1;
}

function change($obj)
{
    $obj->v = 2;
}

function makezero($obj)
{
    $obj = 0;
}

$a = new A();

change($a);

var_dump($a); 

/* 
output:

object(A)#1 (1) {
  ["v"]=>
  int(2)
}

*/

makezero($a);

var_dump($a);

/* 
output (same as before):

object(A)#1 (1) {
  ["v"]=>
  int(2)
}

*/
Run Code Online (Sandbox Code Playgroud)

那么为什么$a在传递给它之后不会突然变成整数makezero?这是因为我们只覆盖了标识符.如果我们通过参考传递:

function makezero(&$obj)
{
    $obj = 0;
}

makezero($a);

var_dump($a);

/* 
output:

int(0) 

*/
Run Code Online (Sandbox Code Playgroud)

现在$a是一个整数.因此,传递标识符和传递引用之间存在差异.

  • 感谢您解释标识符和引用之间的区别,手册对此并不十分清楚. (11认同)
  • 非常有帮助和清晰的解释! (6认同)