如何在PHP5中通过引用传递对象



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

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

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

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

您是否需要使用&通过引用传递的修饰符?

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

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

那么为什么$a在传递给makezero之后没有突然变成一个整数呢?这是因为我们只覆盖标识符。如果我们经过参考

function makezero(&$obj)
{
    $obj = 0;
}
makezero($a);
var_dump($a);
/* 
output:
int(0) 
*/

现在$a是一个整数。因此,通过标识符和通过reference传递是有区别的。

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

幕后发生的事情是,当你传递一个包含对象的变量时,它就是对该对象的引用。因此,变量本身被复制,但它仍然引用相同的对象。所以,本质上有两个变量,但都指向同一个对象。对函数内部对象所做的更改将持续存在。

在你有代码的情况下(首先你需要$even with&):

$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.

你用错了。$符号对于任何变量都是强制性的。它应该是:http://php.net/manual/en/language.references.pass.php

function foo(&$a)
{
$a=null;
}

foo($a);
To return a reference, use
 function &bar($a){
$a=5;
return $a
 }

在对象和数组中,对对象的引用被复制为形式参数,对两个对象的任何相等操作都是引用交换。

$a=new People();
$b=$a;//equivalent to &$b=&$a roughly. That is the address of $b is the same as that of $a 
function goo($obj){
//$obj=$e(below) which essentially passes a reference of $e to $obj. For a basic datatype such as string, integer, bool, this would copy the value, but since equality between objects is anyways by references, this results in $obj as a reference to $e
}
$e=new People();
goo($e);

最新更新