在PHP 5中,您是否需要使用&
修饰符通过引用传递?例如,
class People() { }
$p = new People();
function one($a) { $a = null; }
function two(&$a) { $a = null; )
在PHP4中,您需要&
修饰符在进行更改后维护引用,但我对我读过的关于PHP5自动使用pass-by-reference的主题感到困惑,除非明确克隆对象。
在PHP5中,是否需要通过引用传递所有类型的对象(变量,类,数组......) &
修饰符?
答案 0 :(得分:80)
你需要使用&修饰符传递参考?
从技术上/语义上来说,答案是是,即使对象也是如此。这是因为有两种方法可以传递/分配对象:通过引用或通过标识符。当函数声明包含&
时,如:
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
现在{{1}}是一个整数。因此,通过标识符和通过引用传递之间存在差异。
答案 1 :(得分:0)
你错了。任何变量都必须使用$符号。它应该是: 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);
答案 2 :(得分:0)
对象将通过引用传递。内置类型将按值传递(复制);
幕后发生的事情是,当您传入一个包含对象的变量时,它是对该对象的引用。因此变量本身被复制,但它仍然引用相同的对象。所以,基本上有两个变量,但两者都指向同一个对象。对函数内对象所做的更改将保持不变。
如果您有代码(首先需要$ even和&):
$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.