在下面,我用它自己的密钥设置对$ 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引用,那么它们是否会被提升到全局范围?
答案 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数组变量的引用。当您更改函数内部的引用并将其指向其自身内部的键时,只会更改使用全局键盘实例化的“新”引用。函数外部的实际变量不会被修改。