这是一篇发布时间大于两年的文章,当时的一些内容或笔者曾经的思维可能已不再适用于现在,请谨慎判断文章内容的可靠性


PHP 中的引用类似于指针,引用是不同变量名对实际上内存中同一个变量的表示。对象默认是通过引用传递的,而其他变量是传值,相当于内存中又复制了一份。

//定义一个类,内有共有属性$foo=1
class A
{
    public $foo = 1;
}

//使用变量名传递类
$a = new A;
$b = $a;
$b->foo = 2;
echo "A:" . $a->foo . "\n"; //2
echo "B:" . $b->foo . "\n"; //2

//使用引用传递类
$c = new A;
$d = &$c;
$d->foo = 2;
echo "C:" . $c->foo . "\n"; //2
echo "D:" . $d->foo . "\n"; //2

//在函数中使用变量名传递类
$e = new A;
function foo($obj)
{
    $obj->foo = 2;
}
foo($e);
echo "E:" . $e->foo . "\n"; //2

//在函数中使用引用传递类
$f = new A;
function bar(&$obj)
{
    $obj->foo = 2;
}
bar($f);
echo "F:" . $f->foo . "\n"; //2

//在函数中使用变量名传递变量
$var_a = 1;
function var_foo($v)
{
    $v = 2;
}
var_foo($var_a);
echo "var_a:$var_a\n";  //1

//在函数中使用引用传递变量
$var_b = 1;
function var_bar(&$v)
{
    $v = 2;
}
var_bar($var_b);
echo "var_b:$var_b\n";  //2

//使用变量名传递变量
$var_c = 1;
$var_d = $var_c;
$var_d = 2;
echo "var_c:$var_c\n";  //1
var_dump($var_c === $var_d);    //false

//使用引用传递变量
$var_e = 1;
$var_f = &$var_e;
$var_f = 2;
echo "var_e:$var_e\n";  //2
var_dump($var_e === $var_f);    //true