小米技术社区
小米技术社区管理员 关于小米

27岁,山西运城人,职业电商经理人,前端开发工作者,从事过网站建设、网络推广、SEO、SEM、信息流推广、二类电商、网络运维、软件开发,等相关电商工作,经验较为丰富,小米技术社区致力于为广大从事Web前端开发的人员提供一些力所能及的引导和帮助 ...[更多]

E-mail:mzze@163.com

Q Q:32362389

W X:xiaomi168527

小米技术社区大牛王飞 关于王飞

27岁,山西运城人,职业电商经理人,网络工程师兼运维,从事过运营商网络建设,企业网络建设、优化。数据中心网络维护等通过,经验丰富,座右铭:当自己休息的时候,别忘了别人还在奔跑。 ...[更多]

E-mail:wf_live@126.com

Q Q:3940019

微博:王小贱ss

小米技术社区设计小艳 关于小艳

大于花一样的年龄,河南郑州是我家,2010年在北京接触团购网,2011年进入天猫淘宝一待就是四年,如今已经将设计走向国际化(ps:误打误撞开始进入阿里巴巴国际站的设计,嘿嘿)五年电商设计,丰富经验,从事过天猫淘宝阿里各项设计,店铺运营,产品拍摄;我将我的经历与您分享是我的快乐!座右铭:越努力越幸运! ...[更多]

E-mail:97157726@qq.com

Q Q:97157726

标签云
精品推荐
您的位置:首页 > 后端编程 > PHP > PHP基础

PHP的作用域,超全局,全局,局部,静态,变量,常量等,如何在函数内部访问函数外部变量

分类: PHP基础18个赞

我们知道,js只有全局变量和局部变量

而PHP有3个变量,分别为,超全局变量、全局变量、局部变量

1、超全局变量:可以在函数内部和函数外部访问

2、全局变量:在函数外面

3、局部变量:在函数里面,默认情况下,函数内部是不会去访问函数外部的变量

注意:常量没有作用域的概念

PHP中预定义了几个超级全局变量:


$_POST是一个变量,用来保存post提交的数据
$_GET是一个变量,用来保存get提交的数据
$_REQUESTREQUEST可以获取以POST方法和GET方法提交的数据,
    缺点:速度比较慢 。
$_FILES预定义的数组,用来获取通过 POST 方法上传文件的相关信息
$_ENV包含服务器端环境变量的数组
$_SERVER服务器和执行环境信息
$_SESSION当前脚本可用 SESSION 变量的数组
$GLOBALS是PHP的一个超级全局变量组

变量作用域1:函数的内部不能访问到外部的变量,这点和js不一样

<?php
$num=10;   
function fun() {
	echo $num;     //Notice: Undefined variable: num  
}
fun();
//函数内部默认不能访问函数外部的值


变量作用域2:复制给超全局变量后可全局访问

<?php
$_POST['num']=10;   //将值付给超全局变量
function fun() {
	echo $_POST['num'];    //获取超全局的值   10
}
fun();
---------------------------------------------
<?php
function fun() {
	$_GET['num']=10;  //将值付给超全局变量
}
fun();
echo $_GET['num'];  //打印超全局变量的值  10


变量作用域3:在函数内部访问全局变量--使用$GLOBALS


<?php
$num=10;  //全局变量
function fun() {
	echo $GLOBALS['num'];	//输出全局的$num
}
fun();


$GLOBALS保存的是全局变量的所有的值

<?php
$a=10;
$b=20;
function show() {
	echo '<pre>';
	var_dump($GLOBALS);   //是一个数组,保存的是全局变量的所有的值
}
show();


变量作用域4:使用global关键词使用超全局变量

<?php
$num=10;
function fun() {
	global $num;   //将全局变量的$num的地址引入到函数内部  相当于$num=&GLOBALS['num']
	echo $num;	//10
	$num=100;
}
fun();
echo '<br>';
echo $num;    //100


global用于创建一个全局变量的引用

<?php
/*
define('PI',3.14);
function fun() {
	echo PI;   //3.14
}
fun();
echo '<br>';
*/
-------------------------------------
function fun() {
	define('PI',3.14);
}
fun();
echo PI;   //3.14


静态变量

静态变量一般指的是静态局部变量。

普通变量每调用一次初始化一次,调用完毕销毁,但静态变量只初始化一次

<?php
function fun() {
	$num=10;	//普通变量每调用一次初始化一次,调用完毕销毁
	$num++;
	echo $num,'<br>';
}
fun();	//11
fun();	//11
--------------------------------
<?php
function fun() {
	static $num=10;	//静态变量只初始化一次,调用完毕吧不销毁,第二次调用的时候就不再初始化
	$num++;
	echo $num,'<br>';
}
fun();	//11
fun();	//12


常量和静态变量的区别


1、常量和静态变量都是初始化一次

2、常量不能改变值,静态变量可以改变值

3、常量没有作用域,静态变量有作用域

<?php
function fun1() {
	define('num',10);
}
function fun2() {
	echo num;   //10
}
fun1();
fun2();
------------------------------------------------------------
<?php
function fun1() {
	static $num=10;
}
function fun2() {
	echo $num;  //Notice: Undefined variable: num 因为静态变量是有作用域的
}
fun1();
fun2();


匿名函数use()

默认情况下,函数内部不能访问函数外部的变量,但在匿名函数中,可以通过use将外部变量引入匿名函数中

<?php
$num=10;
$fun=function() use($num) {  //将$num引入到匿名函数中
	echo $num;	
};
$fun();   //10

use可以引入值,也可以引入地址

<?php
$num=10;
$fun=function()use(&$num){   //use可以传地址
	$num=100;
};
$fun();
echo $num;  //100

如何在函数内部访问函数外部变量

1、使用超全局变量


2、$GLOBALS


3、global关键字


4、use将函数外部变量引入到匿名函数内部


demo:

<?php
$num=10;
function test() {
	$num=20;
	$fun=function() use($num) {   //只能引入一层
		echo $num;
	};
	$fun();
}
test();    //20


小米技术社区