我正在尝试理解一些代码而且有些东西我没有得到。该代码使用对参数中的数组的引用和函数块中的引用。我创建了以下示例代码:
function some_function(&$array)
{
// assign a value to a new key in the empty array
$array['somekey'] = 'somevalue';
// set the array to reference this key
$array = &$array['somekey'];
// var_dump() of the array shows 'somevalue'
var_dump($array);
}
$my_array = [];
some_function($my_array);
// var_dump() now shows the initial value of ['somekey'] => 'somevalue' ???
var_dump($my_array);
下面是2个var_dumps的输出。
string(9) "somevalue" array(1) { ["somekey"]=> string(9) "somevalue" }
我的问题是:为什么在离开函数后忽略了第二个赋值?
function some_function(&$ array){}将array-argument的第一个元素$ array [0]的地址作为引用地址。在函数内,重新分配仅改变了$ array [0]的值,因为$ array被重新分配以指向数组['somekey']的值,并在重新分配后更改为$ array的数组['somekey']的值。
<?php
function some_function(&$array)
{
// assign a value to a new key in the empty array
$array['somekey'] = 'somevalue';
echo gettype($array);
echo "<br>";
var_dump($array);
echo "<br>";
// set the array to reference this key
$array = &$array['somekey'];
// var_dump() of the array shows 'somevalue'
var_dump($array);
echo "<br>";
echo gettype($array);
echo "<br>";
$array='different value';
echo "<br>";
echo gettype($array);
echo "<br>";
var_dump($array);
}
$my_array = [];
echo "<br><br>";
var_dump($my_array);
some_function($my_array);
echo "<br><br>";
// var_dump() now shows the initial value of ['somekey'] => 'somevalue' ???
var_dump($my_array); // ['somekey'] shows 'different value' because the value was changed in the function.
echo "<br><br>";
echo gettype($my_array);
echo "<br><br>";
?>
第二项任务不会被忽略。让我们逐行打破代码。
$my_array = [];
some_function($my_array);
function some_function(&$array)
{
现在符号$my_array
(在全局范围内)和符号$array
(在函数的局部范围内)都是对同一个空数组的引用。
// assign a value to a new key in the empty array
$array['somekey'] = 'somevalue';
这会修改数组,两个符号仍然引用它。
// set the array to reference this key
$array = &$array['somekey'];
这一行告诉PHP,符号$array
现在应该引用字符串'somevale'。但符号$my_array
不受其影响。如果要更改两个符号引用的值,只需使用正常赋值:
$array = $array['somekey'];
两个var_dumps都会显示相同的内容。
因为引用不像C指针那样工作。
由于$ my_array在函数some_function()中不可用,因此无法使用引用机制将调用范围中的$ my_array绑定到其他内容。
阅读What References Are Not上的PHP手册