作用域
变量作用域
概念
- 变量作用域
- 全局变量:在函数外面
- 局部变量:在函数里面,默认情况下,函数内部是不会去访问函数外部的变量
- 超全局变量:可以在函数内部和函数外部访问
<?php
# 将值付给超全局变量
$_POST['num']=10;
function fun1() {
echo $_POST['num'];
}
fun1();
echo "<br>";
# 将值付给超全局变量
function fun2() {
$_GET['num']=20;
}
fun2();
echo $_GET['num'];
?>
在函数内部访问全局变量
<?php
$word= '泥萌';
function fun1() {
echo $GLOBALS['word'];
}
fun1();
echo "<br>";
function fun2(){
$GLOBALS['word']= '蜗萌';
}
fun2();
echo $word;
?>
global关键字
- global关键字
$GLOBALS
保存的是全局变量的所有的值
global
用于创建一个全局变量的引用
<?php
# 将全局变量的$word的地址引入到函数内部
$word= '泥萌';
function fun1() {
global $word;
// $word= $GLOBALS['word'];
echo "fun1:{$word}<br>";
$word= '蜗萌';
}
fun1();
echo "全局:{$word}";
echo "<hr>";
# 销毁的是引用,不是具体的值
function fun2(){
global $word;
echo "fun2:{$word}<br>";
unset($word);
echo "fun2销毁后:{$word}<br>";
}
fun2();
echo "全局:{$word}";
?>
<?php
# 是一个数组,保存的是全局变量的所有的值
$sunny= '泥萌';
$jerry= '蜗萌';
$tomy= '塔萌';
function show() {
echo '<pre>';
var_dump($GLOBALS);
}
show();
?>
常量没有作用域的概念
<?php
function fun() {
define('PI',3.14);
}
fun();
echo PI;
?>
静态变量(static)
- 静态变量
- 静态变量一般指的是静态局部变量。
- 静态变量只初始化一次
<?php
# 普通变量每调用一次初始化一次,调用完毕销毁
function fun1(){
$num= 10;
$num++;
echo $num,'<br>';
}
fun1();
fun1();
echo "<hr>";
# 静态变量只初始化一次,调用完毕吧不销毁,第二次调用的时候就不再初始化
function fun2(){
static $num= 10;
$num++;
echo $num,'<br>';
}
fun2();
fun2();
?>
- 常量和静态变量的区别
- 常量和静态变量都是初始化一次
- 常量不能改变值,静态变量可以改变值
- 常量没有作用域,静态变量有作用域
匿名函数use()
- 匿名函数
- 默认情况下,函数内部不能访问函数外部的变量
- 但在匿名函数中,可以通过use将外部变量引入匿名函数中
use()
只能引入一层函数
use()
可以传地址
<?php
# 将$num引入到匿名函数中
$num=10;
$fun=function() use($num) {
echo $num;
};
$fun(); //10
?>
<?php
# 只能引入一层
$num=10;
function test() {
$num=20;
$fun=function() use($num) {
echo $num;
};
$fun();
}
test();
?>
<?php
# use()可以传地址
$num= 10;
$fun=function() use(&$num){
$num= 100;
};
$fun();
echo $num; //100
?>
小结
- 在函数内部访问函数外部变量的方法
- 使用超全局变量
$GLOBALS
global
use
将函数外部变量引入到匿名函数内部