作用于:变量(常量)能够被访问的区域
1、变量可以在普通代码中定义
2、变量也可以在函数内部定义
在PHP中作用于严格来说分为两种,但是PHP内部还定义一些在严格意义之外的一种,所以总共算三种:
<?php
//默认的代码空间是:全局空间
$global = 'global area';
//局部变量(函数内部定义)
function display(){
$inner = __FUNCTION__; //局部变量 存的是函数名
echo $global;//访问全局变量 函数内不能访问全局空间的变量
//调用函数
display();
//全局空间无法访问局部变量,会出错
echo $inner;
}
?>
1、全局变量
:就是用户定义在变量(函数外部定义的变量)
所属全局空间:在php中执行允许在全局空间使用,理论上函数内部不可使用
脚本周期:知道脚本脚本运行结束(最后一行代码执行完毕生命周期结束)
2、局部变量
:结束在函数内部定义的变量
所属当前函数空间:在php中值运行在当前函数的内部使用
函数周期:函数执行结束(函数是在栈区中开辟独立内存空间运行)
3、超全局变量
:系统定义的变量(预定义变量: $_SERVER
、$_POST
等)
所属全局空间:没有访问限制(函数内外部都可以访问)
所属超全局空间:没有访问限制(函数内外都可以访问)
超全局变量会将全局变量自动纳入到$GLOBALS
里面。而$GLOBALS
没有作用域限制,所以能够帮助局部变量去访问全局变量,但是必须使用数组方式
<?php
//默认的代码空间是:全局空间
$global = 'global area';
//局部变量(函数内部定义)
function display(){
}
//使用超全局变量让局部变量可以访问全局变量
//var_dump($GLOBALS);
echo $GLOBALS['global'];
//调用函数
display(); //不调用函数的话无法执行函数体
?>
如果想让函数内部使用外部变量:除了 $GLOBALS
之外,通过参数传值(如果要达到值统一还可以使用引用传值(取地址))
在PHP中,其实还有另一种方式,能够实现全局访问局部,同时局部也可以访问全局:global
关键词
global
关键词:是一种在函数里面定义变量的一种方式
1、如果使用global定义的变量名在外部存在(是全局变量),那么系统在函数内部定义的变量直接指向外部全局变量所指向的内存空间(同一变量);
2、如果使用global定义的变量名在外部不存在(全局变量),系统会自动在全局空间(函数外部)定义一个与局部变量同名的全局变量
本质的形式:在函数内部和外部,对一个同名变量(全局变量和局部变量)使用同一块内存地址保存数据,从而实现共同拥有
基本语法:
global 变量名; //不能赋值
变量名 = 值; //修改
局部变量访问全局变量的几种方式
1.局部变量访问全局变量的方式(global关键词)
<?php
//默认的代码空间是:全局空间
$global = 'global area';
//定义函数
function display(){
global $global; //global关键词,将同名函数指向同一地址
echo $global;
}
display();
?>
全局空间存在变量,global定义同名的局部变量(必须在外部调用函数,否走函数不执行)
②如果没有定义全局变量,那么在函数内部使用global后系统会自动在全局空间定义一个同名的全局变量
<?php
function display(){
//定义变量:全局变量不存在
global $a;
$a = 'inner';
}
display();
echo $a;
?>
2.局部变量访问全局变量的方式($GLOBALS[''])
<?php
//默认的代码空间是:全局空间
$a = 'global area';
function display(){
//访问全局变量
echo $GLOBALS['$a'];
}
display()
?>
3.引用传值(取全局变量的地址,内部函数和外部函数统一指向同一地址)
<?php
$chuan = 1;
function display(&$a){
echo $a;
}
display($chuan);
?>
不取变量地址,实参传入实参(不指向同一地址达到内部变量访问外部的全局变量)
<?php
$chuan = 1;
function display($a){
echo $a;
}
display($chuan);
?>
全局变量访问局部变量的方式
<?php
//全局空间没有定义全局变量,但在函数display内部使用了global关键词
//因此此处被系统自动定义了一个同名函数$inner 并指向同一地址
function display(){
global $inner;
$inner = 1;
}
display();
echo $inner;
?>
这种访问方式,本质上与在外部没有定义全局变量,但是系统自动定义同名全局变量的效果一致。
虽然以上方式可以实现局部与全局的互访,但是通常不会这么用,一般情况如果存在特殊使用,也会使用参数的形式来访问。(还可以使用常量:define定义)