1.2 作用域
1.2.1 變量作用域
1、全局變量:在函數外面
2、局部變量:在函數裡面,預設情況下,函數内部是不會去通路函數外部的變量
3、超全局變量:可以在函數内部和函數外部通路

<?php
$num=10;
function fun() {
echo $num; //Notice: Undefined variable: num
}
fun();
//函數内部預設不能通路函數外部的值
---------------------
<?php
$_POST['num']=10; //将值付給超全局變量
function fun() {
echo $_POST['num']; //擷取超全局的值 10
}
fun();
----------------------------
<?php
function fun() {
$_GET['num']=10; //将值付給超全局變量
}
fun();
echo $_GET['num']; //列印超全局變量的值 10
在函數内部通路全局變量
<?php
$num=10; //全局變量
function fun() {
echo $GLOBALS['num']; //輸出全局的$num
}
fun();
練習:如下代碼輸出什麼
<?php
function fun() {
$GLOBALS['num']=10; //将值付給全局的$num
}
fun();
echo $num; //10
global關鍵字
<?php
$num=10;
function fun() {
global $num; //将全局變量的$num的位址引入到函數内部 相當于$num=&GLOBALS['num']
echo $num; //10
$num=100;
}
fun();
echo '<br>';
echo $num; //100
-----------------------------------
<?php
$num=10;
function fun() {
global $num;
unset($num); //銷毀的是引用,不是具體的值
}
fun();
echo $num; //10
小結:
1、$GLOBALS儲存的是全局變量的所有的值
<?php
$a=10;
$b=20;
function show() {
echo '<pre>';
var_dump($GLOBALS); //是一個數組,儲存的是全局變量的所有的值
}
show();
2、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
1.2.2 靜态變量(static)
靜态變量一般指的是靜态局部變量。
靜态變量隻初始化一次
<?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();
1.2.3 匿名函數use()
預設情況下,函數内部不能通路函數外部的變量,但在匿名函數中,可以通過use将外部變量引入匿名函數中
<?php
$num=10;
$fun=function() use($num) { //将$num引入到匿名函數中
echo $num;
};
$fun(); //10
思考:如何在函數内部通路函數外部變量
1、使用超全局變量
2、$GLOBALS
3、global
<?php
$num=10;
function test() {
$num=20;
$fun=function() use($num) { //隻能引入一層
echo $num;
};
$fun();
}
test(); //20
<?php
$num=10;
$fun=function()use(&$num){ //use可以傳位址
$num=100;
};
$fun();
echo $num; //100