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

2022-08-30 16:48:41

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

class People() { }
$p = new People();
function one($a) { $a = null; }
function two(&$a) { $a = null; )

在 PHP4 中,您需要修饰符在进行更改后维护引用,但是我对所读到的有关 PHP5 自动使用逐个引用传递的主题感到困惑,除非显式克隆对象。&

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


答案 1

您是否需要使用 & 修饰符来传递引用?

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

function func(&$obj) {}

无论如何,该参数都将通过引用传递。如果您声明没有&

function func($obj) {}

所有内容都将按值传递,但对象和资源除外,然后通过标识符传递。什么是标识符?好吧,您可以将其视为对引用的引用。举个例子:

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)
}

*/

那么,为什么在传递给整数后不会突然变成整数呢?这是因为我们只覆盖了标识符。如果我们通过引用$amakezero

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

makezero($a);

var_dump($a);

/* 
output:

int(0) 

*/

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


答案 2

对象将按引用传递。内置类型将按值传递(复制);

幕后发生的事情是,当您传入一个保存对象的变量时,它是对该对象的引用。因此,变量本身被复制,但它仍然引用同一个对象。因此,基本上有两个变量,但两者都指向同一个对象。对函数内对象所做的更改将保持不变。

在你拥有的代码的情况下(首先你需要$ 即使有&):

$original = new Object();

one($original); //$original unaffected
two($original); //$original will now be null

function one($a) { $a = null; } //This one has no impact on your original variable, it will still point to the object

function two(&$a) { $a = null; ) //This one will set your original variable to null, you'll lose the reference to the object.

推荐