PHP函数引用问题

<?php
$var3 = 1;
$var4 = 2;
function test2(){
    global $var3,$var4;
    $var4 = &$var3;
    $var4 = 3;
    //$var3 = 3;
}
test2();
echo $var4 ;
?>

问题1:这里$var4为何还是输出2呢,不管是在后面重新给$var3还是$var4赋值都不起效果,我的理解是在函数里$var3将引用和值传给了$var4,那么$vars4就应该和$var3指向同一个地址了。。。。

问题2:求推荐一本适合PHPer的书,我比较喜欢专研上面这些 PHP原理的书,谢谢了。

阅读 1.7k
3 个回答

在执行global $var4;时,php产生了一个和全局变量同名的局部变量,指向了全局变量。
$var4 = &$var3; 时,局部变量$var4不再指向全局变量$val4,而重新指向全局变量$var3
局部变量$var4的改变,不会再影响到全局变量$val4,只会影响到重新指向的全局变量$val3

直接查阅注释

<?php

$var_1 = 1;
$var_2 = 2;

(function (){
    global $var_1,$var_2;

    var_dump('m:l:'.__LINE__.':'.memory_get_usage());
    $var_2 = &$var_1;
    var_dump('m:l:'.__LINE__.':'.memory_get_usage());
    // 至此 $var_2 已经不是全局的 $var_2 已经和全局失去关系了 引用了 &$var1
    $var_2 = 4;
    // 现在打印 $GLOBALS 数组中的值 可以看到这里的值还是全局的可以和全局发生关系
    // 这里就可以看到 两个已经不同了
    var_dump('f:'.$GLOBALS['var_2'],'f:'.$var_2);
    var_dump('m:l:'.__LINE__.':'.memory_get_usage());
    // 此处这里的全局变量还是存在 可以继续操作下去。
    $GLOBALS['var_2'] = 6;
    var_dump('m:l:'.__LINE__.':'.memory_get_usage());
})();

var_dump($var_1,$var_2);
C:\Users\wonly\Desktop\a.php:9:
string(12) "m:l:9:347784"
C:\Users\wonly\Desktop\a.php:11:
string(13) "m:l:11:347816"
C:\Users\wonly\Desktop\a.php:16:
string(3) "f:2"
C:\Users\wonly\Desktop\a.php:16:
string(3) "f:4"
C:\Users\wonly\Desktop\a.php:17:
string(13) "m:l:17:347768"
C:\Users\wonly\Desktop\a.php:19:
string(13) "m:l:19:347768"
C:\Users\wonly\Desktop\a.php:22:
int(4)
C:\Users\wonly\Desktop\a.php:22:
int(6)
[Finished in 0.3s]

如果你是用了类似PHPStorm这样的开发工具,在书写阶段其实就会告诉你 $var4 未使用。

clipboard.png

在函数中定义global 变量时,是传引用,
定义global $var4; 会生成两个变量关系为 $local_var4 = &$global_var4;
函数中的第三行可以理解为:$local_var4 = &$local_var3,又变为$local_var3 的引用,
$local_var3又是$global_var3 的引用
所以第四行会导致$var3的值变为3,与全局$var4无关

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题