对php引用的理解

/**
 * 引用是符号表别名
 */
// $a与$b指向同一个变量
$a = &$b;
// 定义函数foo,参数为引用类型:&$var,无函数体
function foo(&$var) {
    //
}
// 将未定义的$c传递给foo
foo($c);
// $c会被自动定义,并被赋值为NULL
var_dump($c); // NULL
// var_dump($d); // NULL,产生PHP警告:Notice: Undefined variable: d
// 定义数组$d
$d = array();
// 将$d['name']传递给foo
foo($d['name']);
// 数组$d中不存在键name,经过赋值给函数foo之后
// $d['name']被自动定义并被赋值为NULL
var_dump(is_null($d['name'])); // bool(true)
var_dump(array_key_exists('name', $d)); // bool(true)
// 创建StdClass对象$e
$e = new StdClass;
// 将age属性传递给函数foo
foo($e->age);
// 属性age被自动创建,并被赋值为NULL
var_dump(property_exists($e, 'age')); // bool(true)
var_dump($e->age); // NULL
// foreach中给一个具有引用的变量赋值
$ref = 0;
// 此时$ref与$row都指向$ref
$row = &$ref;
// 用foreach给$row赋值
foreach(array(1, 2, 3) as $row) {
    //
}
echo $ref . PHP_EOL; // 3
// 用引用传递变量
function bar(&$var) {
    ++$var;
}
$f = 10;
// 参数$f不需要加&,只在bar函数定义时加&
bar($f);
echo $f . PHP_EOL; // 11
// 在函数内部给一个声明为global的变量赋于一个引用,该引用只在函数内部可见
// 可以用$GLOBALS数组避免这一点
$var1 = 'Example variable';
$var2 = '';
function global_references($use_globals) {
    global $var1, $var2;
    var_dump('$var1: ' . $var1);
    var_dump('$var2: ' . $var2);
    if (!$use_globals) {
        $var2 = &$var1;
    } else {
        $GLOBALS['var2'] = &$var1;
    }
}
global_references(false);
echo "when false, var2 = '$var2'\n";
global_references(true);
echo "when true, var2 = '$var2'\n";
// 输出结果
// string(23) "$var1: Example variable"
// string(7) "$var2: "
// when false, var2 = ''
// string(23) "$var1: Example variable"
// string(7) "$var2: "
// when true, var2 = 'Example variable'
$g = 1;
$h = &$g;
unset($g);
var_dump($g); // NULL, PHP Notice:  Undefined variable: g
var_dump($h); // int(1)
// 用global $var声明一个变量时实际上建立了一个到全局变量的引用
// global $var;   ===  $var = &$GLOBALS['var']; 两者是等价的
// unset($var)不会unset全局变量$GLOBALS,而是unset $GLOBALS['var']
global $var5;
echo '全局变量:' . PHP_EOL;
var_dump($GLOBALS['var5']); // NULL
unset($var5);
echo 'unset($var5)之后,全局变量:' . PHP_EOL;
var_dump($GLOBALS['var5']); // NULL, PHP Notice:  Undefined index: var5

 

posted @ 2019-10-23 16:01  勾践  阅读(230)  评论(0)    收藏  举报