调用域就是由变量决定其可以被访问的工作区域
全局作用域 : 全局变量 函数外部定义 只能在函数外部访问 一直到脚本执行结束 生命周期才会结束
局部作用域 : 局部变量 函数内部定义 只能在函数本身访问 函数执行完毕 生命周期结束
超全局作用域 : 任何地方都可以访问到 主要是系统预定义变量
作用域的作用主要是为了节约内存的使用
函数内部访问全局变量的方式:
1 第一种 是通过调用函数的参数机制 把全局变量作为参数调用函数 从而使函数内部的局部变量拥有与全局变量一样的值或者同一个地址(&地址符号)
2 第二种是利用系统的预定义变量 $GLOBALS $GLOBALS 系统预定义变量是一种包含所有系统预定义变量(包含他自己)和自定义变量的关联数组 键名对应变量名 值对应变量的内容
<?php
$a=10;
$b=20; //a与b都是全局变量 在函数内部无法访问
function sum(){
return $GLOBALS["a"]+$GLOBALS["b"]; //预定义变量$GLOBALS[]键名为变量名 例如 get post cookie 等
}
echo sum();
?>
利用$GLOBALS 的超全局变量特性可以实现函数内访问全局变量的要求
第三种方式是利用关键字global (全局) global的工作原理是 在函数内定义一个变量 被global修饰 然后匹配全局变量名 如果有同名的全局变量 那么就让局部变量指向该全部变量的地址 如果没有同名的全局变量 就会在内存中新建一个全局变量然后让局部变量指向全局变量的地址 总之就是被global修饰过的局部变量既可以当作局部变量让本函数使用 又可以当作全局变量在函数外使用
<?php
$a=10;
$b=20;
function sum(){
global $a; //global 修饰 匹配全局变量$a
global $b; //global 修饰 匹配全局变量$a
$a++;
$b++;
echo $a,'<nbsp/>',$b;
unset($a);
unset($b);
}
sum();
echo $a,'<nbsp/>',$b;
?>
值得需要注意的是 利用global 修饰的局部变量相当于 一个局部变量与一个相同名字的全局变量同时指向一个地址 所以当在函数内改变变量的值的时候对应的全局变量的值也会改变 上面中的unset()消除的也只是删除了局部变量与地址之间的引用