變量的定義:
變量就是計算機的內存單元;
變量的名稱定義:
變量的名稱就是計算機內存單元的名稱 | 指針,也可以理解為內存單元的引用;
變量的書寫方式:
$ + 標識符 = 變量的聲明;
變量的作用域定義:
能夠訪問變量的范圍;
變量的作用域范圍分類:
超全局變量 —— 一般是 PHP 內置的變量;
全局變量—— 在當前 PHP文檔內,函數的外部能夠訪問的變量;在函數內部調用全局變量必須使用 global 關鍵字聲明;
局部變量—— 在函數的內部聲明,只能在本函數的內部訪問,不能在函數的外部,或者嵌套函數的內部訪問的變量;函數的參數也是局部變量;如果需要在函數的外部使用函數內部的變量,同時使用關鍵字 global 申明即可;但是在嵌套函數的內部依然無法使用;同樣在嵌套函數內部用global申明的變量,在外部的包圍函數中也沒有辦法訪問;
靜態變量——一種特殊的局部變量(作用域范圍相似,但是機制不同,非標準的說法;),在函數的內部定義,當函數執行完成已有依然能夠保存變量值的特殊變量;用static 關鍵字聲明;只能夠在函數中訪問;
static 和 global 只能夠使用一個,重復使用也只會保持一個特性;
另兩種特殊變量:
引用變量;(這是我自己私人命名的變量,非標準!)——變量的值是另一個變量的引用(變量引用);
可變變量:如果一個變量的值,剛好同另一個變量的標識符相同,那么在這個變量的前面添加一個 $ ,這樣的書寫形式就是可變變量;
變量的引用:一個變量的值是引用的另一個變量,他們指向同一個內存單元;同過 & 實現;
超全局變量實例:
一般在PHP內的預定義變量都是超全局變量,在函數的內外都能夠訪問;
$_COOKIE #包含setcookie() 設置的所有信息;
$_SESSION #包含所有的回話信息;
$_POST #包含用 POST 方法傳遞過來的數據
$_GET #包含用 GET 方法傳遞過來的數據
#......
全局變量:
在PHP 函數外部定義的變量;
<?php
$str_name = 'bill';
function get_name (){
echo $str_name ; # notice:undefined variable
}
?>
在函數內部訪問全局變量的方法;
方法1:
用global 關鍵字申請這個變量;
<?php
$str_name = 'bill';
function show_name (){
global $str_name;
echo $str_name ;
}
show_name();
#output : bill
?>
備注:
如果在函數內部改變$str_name 的值,那么同樣會影響函數外部的$str_name 的值,因為他們就是同一個變量;
方法2:
把這個變量當做參數傳遞給函數;
<?php
$str_name = 'bill';
function show_name ($a){
echo $a;
}
show_name($str_name);
#output:bill
?>
備注:
這的$a 同$str_name 是兩個不同的變量,僅僅只是變量的值相同,內部的改變不會影響外部的變量;
方法3:
傳遞變量的引用;
$str_name = 'bill';
function show_name(&$str_inside_name){
echo $str_inside_name.'<br/>'; #=> bill;
$str_inside_name = 'tom'; #改變變量的值;
echo $str_inside_name.‘’<br/>‘’; #=> tom;
}
show_name($str_name);
echo $str_name; #=>tom
備注:
這里的 $str_name 同 $str_inside_name 其實是同一個變量,只是表示符不同罷了;他們都指向同一個內存空間;
局部變量:
局部變量就是在函數內部定義的變量,在函數的外部和嵌套函數內部都不能夠訪問;
實例:
function show_name(){
$str_name = 'bill';
echo $str_name ;
}
show_name() #=> bill
echo $str_name; #NULL;
訪問局部變量的方法;
方法1:
在全局范圍內訪問局部變量的方法;
function show_name (){
global $str_name;
$str_name = 'bill';
}
show_name();
echo $str_name ; #=>bill;
在函數的內部用 global 定義;
在函數的內部定義的全局變量,在函數中和全局范圍內可見;
方法2:
在函數的內部訪問嵌套函數的內部變量;
function outside(){
function inside(){
global $inside_name;
$inside_name = 'inside_name';
}
inside();
global $inside_name;
echo $inside_name;
}
outside(); #=> inside_name;
備注;
從上面我們可看出,函數內部不能夠訪問嵌套的函數中的變量;不管是外層的訪問內層的,還是內層的訪問外層的;
函數內部只能夠訪問全局變量和自己內部的變量;
靜態變量
在函數執行完成后不會被銷毀的只能在函數中訪問,在嵌套函數的內部和全局范圍內無法訪問的變量,
實例:
function outside(){
static $str_name ;
$str_name = 'bill';
function inside(){
global $str_name;
$str_name = 'tom';
echo $str_name; #=> tom
}
inside();
echo $str_name; #=> bill
}
outside()
echo $str_name; #=> tom
可變變量:
變量的標識符是另一變量的變量;
如果一個變量的值,剛好同另一個變量的標識符相同,那么在這個變量的前面添加一個 $ ,這樣的書寫形式就是可變變量;
實例:
$name = 'bill';
$str = 'name';
$$str; #這就是可變變量,先計算 $str 的結果,在把這個結果結合$字符在計算;
echo $$str #=> 'bill';
變量引用:
實例:
$str_name_1 = 'bill';
$str_name_2 = &$str_name_1; # 這就是變量引用;
$str_name_2 = 'tom'; #修改一個變量的值,會影響另一個變量;
echo $str_name_1.$str_name_2; #=> tomtom
綜述:
變量是計算機內存的外在顯示,通過變量我們能夠操作內存單元;
當我們定義變量的時候,也就定義了變量的使用范圍,也就是作用域范圍,在范圍外,無法訪問范圍內的變量;
一個變量只能夠對應一個內存單元,但是一個內存空間可以有多個變量來指向,通過變量引用來實現;