PHP的一个全局变量如果引用了一个局部变量的地址
$b = "dasdf"; function abc(){ $a = "abc"; global $b; $b = &$a; echo $b."inner;"; } abc(); echo $b.";";
在函数内部输出b的时候,是abc,但是离开函数后,输出b,又恢复成dasdf的初始值,这是怎么回事呢?按理说,引用了一个局部变量的地址,这个局部变量销毁后,b的值应该是空啊。
回复讨论(解决方案)
在手册:
http://www.php.net/manual/zh/language.references.whatdo.php#example-251
如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免这一点。
原因如下:
把 global $var; 当成是 $var =& $GLOBALS['var']; 的简写。从而将其它引用赋给 $var 只改变了本地变量的引用。
$b = "dasdf";
function abc(){
$a = "abc";
global $b; //这是对 $GLOBALS['b'] 的引用
$b = &$a;
$GLOBALS['bb'] = & $a;
echo $b."inner;";
}
abc(); //abcinner;
echo $b.";"; //dasdf;
echo $bb; //abc
明白了, 函数内的$b其实根本不是全局的$b, 它仍然是局部变量, 只不过global $b 这一句, 除了声明这个变量还给它指向全局变量. 所以改变它的值(重新赋值)会导致全局变量被改写. 但是 $b = &$a 这一句又把局部变量$b指向了$a指向的对象. 外面的$b一直指向那个全局对象.
记住php的两个概念,所有变量都是指针,所有作用域不同的变量是不同的变量,即可
记住php的两个概念,所有变量都是指针,所有作用域不同的变量是不同的变量,即可
发现其实 JavaScript 前一条也是, 但是后一条 JavaScript 不同.
不过 JavaScript 本质上没有赋值语句, JavaScript 只是创造新的对象或者销毁对象, 或者改变一个变量指向的对象. 它从来不会改写一个对象的值, 而PHP会, PHP更像 C++, JavaScript 更像纯粹的面向对象.
是不是撤销一个变量的内存,那么引用变量的内存也会被撤销? 如果这样的话,你写的可以这样理解:因为函数运行完了,自动释放的局部变量。那么相应的把引用变量也给释放了。当你在外面使用变量的时候进行重新赋值了?
上一篇: 详解vue的diff算法原理
下一篇: 用php实现文件上载支持断点
推荐阅读
-
函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!闭包访问局部变量
-
PHP的一个全局变量如果引用了一个局部变量的地址
-
javascript - js 或 php 有没有一个 函数 判断 一个url ,如果404跳的A地址 如果不是404 直接请求url 就行
-
PHP的一个全局变量如果引用了一个局部变量的地址
-
PHP的一个全局变量如若引用了一个局部变量的地址
-
PHP的一个全局变量如其引用了一个局部变量的地址
-
PHP的一个全局变量如若引用了一个局部变量的地址
-
函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!闭包访问局部变量