引用做什么

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)

results matching ""

    No results matching ""