php引用详解

引用是什么

PHP 中的引用意味着不同的变量名字访问同一个变量内容
引用可以被看作是 Unix 文件系统中的硬链接

引用是做什么

1.引用赋值

注:这意味着变量a和变量b指向同一个内容,无论改变哪个变量的值,另一个变量的值都会改变
注:$a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方

1
2
3
4
5
<?php
$a = 1;
$b = 3;
$a = &$b;
?>

注:如果对一个未定义的变量进行引用赋值、引用参数传递或引用返回,则会自动创建该变量

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function foo(&$var) { }

foo($a); // $a is "created" and assigned to null

$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)

$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>

注:如果具有引用的数组被拷贝,其值不会解除引用。对于数组传值给函数也是如此

1
2
3
4
5
6
7
8
9
10
11
<?php
$a = array(1,3,2);
$b = 1;
$b = &$a;
var_dump($b);
var_dump($a);
$a[] = 4;
var_dump($b); // array(1,3,2,4)
var_dump($a); // array(1,3,2,4)
exit;
?>

注:如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免这一点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$var1 = "Example variable";
$var2 = "";

function global_references($use_globals)
{
global $var1, $var2;
if (!$use_globals) {
$var2 =& $var1; // visible only inside the function
} else {
$GLOBALS["var2"] =& $var1; // visible also in global context
}
}

global_references(false);
echo "var2 is set to '$var2'\n"; // var2 is set to ''
global_references(true);
echo "var2 is set to '$var2'\n"; // var2 is set to 'Example variable'
?>
?>

注:如果在 foreach 语句中给一个具有引用的变量赋值,被引用的对象也被改变

1
2
3
4
5
6
7
8
<?php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
// do something
}
echo $ref; // 3 - last element of the iterated array
?>
2.引用传递

注: 可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值

1
2
3
4
5
6
7
8
9
10
11
<?php
$b = 2;
$a = 1;
function a(&$b){
$b += 100;
}

a($a);
var_dump($a); // 101
var_dump($b); // 2
?>
3.引用返回

注: 引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
class foo {
public $value = 42;

public function &getValue() {
return $this->value;
}
}

$obj = new foo;
$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42.
$obj->value = 2;
echo $myValue; // prints the new value of $obj->value, i.e. 2.

?>