在不在全局范围内的函数中定义的PHP引用

时间:2013-12-01 04:04:31

标签: php

在下面,我用它自己的密钥设置对$ myarray数组的引用。在调用它的函数中遵循引用,但是如果我在函数外部调用相同的数组变量,则引用将丢失。

$myarray = array("level1" => array("level2" => array("level3" => "value")));

function test(){
    global $myarray;
    $myarray =& $myarray["level1"];
    print_r($myarray); //returns "Array ( [level2] => Array ( [level3] => value ) )"
}

test();

echo "<br>";

print_r($myarray); //returns "Array ( [level1] => Array ( [level2] => Array ( [level3] => value ) ) )"

如果在函数中定义了PHP引用,那么它们是否会被提升到全局范围?

3 个答案:

答案 0 :(得分:1)

创建引用本身意味着您正在创建别名或说出它的另一个实例。 所以现在这种行为在技术上和字面上都是正确的。因为您在函数内创建了实例,以便覆盖GLOBAL概念。

而不是$myarray = &$myarray["level1"];如果您使用$myarray = $myarray["level1"];,那么您将获得所需的结果。

答案 1 :(得分:0)

在函数内部,您正在执行$myarray = & $myarray["level1"] - 当您执行此操作时,您将level1子数组分配给$myarray$myarray变量仅存在于函数范围内,因此当您在函数外部尝试print_r()时,它只显示在全局范围内定义的变量的内容。

如果您希望能够修改原始数组,则需要pass it by reference

$myarray = array("level1" => 
        array("level2" => 
        array("level3" => "value"))
    );

function test(& $myarray){
    $myarray = $myarray["level1"];
    print_r($myarray);
}

test($myarray);

print_r($myarray);

这将输出:

Array ( [level2] => Array ( [level3] => value ) ) 
Array ( [level2] => Array ( [level3] => value ) )

答案 2 :(得分:0)

引用在函数外部丢失的原因是因为函数内部的$ myarray全局变量实际上本身是对函数外部的$ myarray数组变量的引用。当您更改函数内部的引用并将其指向其自身内部的键时,只会更改使用全局键盘实例化的“新”引用。函数外部的实际变量不会被修改。