引用做什么
PHP 的引用允许用两个变量来指向同一个内容。
<?php
$foo = 'foo';
$bar = &$foo;
如果对一个未定义的变量进行引用赋值,引用参数传递或引用返回,则会自动创建该变量。
<?php
/**
* Using references with undefined variables.
*
* @param string|null &$variable
* @return void
*/
function foo(?string &$variable = null)
{
//
}
foo($foo);
var_dump($foo); // NULL
$foo = [];
foo($foo['foo']);
var_dump($foo); // array(1) { ["foo"]=> NULL }
$foo = new stdClass();
foo($foo->foo);
var_dump(property_exists($foo, 'foo')); // bool(true)
如果在一个函数内部给一个声明为 global
的变量赋予一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS
超全局数组来避免这一点。
<?php
/**
* Referencing global variables inside functions.
*
* @param bool $option
* @return void
*/
function foo(bool $option)
{
global $foo, $bar;
if (!$option) {
$bar = &$foo;
} else {
$GLOBALS['bar'] = &$foo;
}
}
$foo = 'foo';
$bar = 'bar';
foo(false);
var_dump($bar); // string(3) "bar"
foo(true);
var_dump($bar); // string(3) "foo"
如果在 foreach
语句中给一个具有引用的变量赋值,被引用的对象也被改变。
<?php
$foo = [2, 4, 5];
foreach ($foo as &$value) {
$value += 1;
}
unset($value);
var_dump($foo); // array(3) { [0]=> int(3) [1]=> int(5) [2]=> int(6) }
可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。
<?php
/**
* Passing function parameters by reference.
*
* @param int &$number
* @return void
*/
function foo(int &$number)
{
$number++;
}
$foo = 5;
foo($foo);
var_dump($foo); // int(6)