變數
變數在程式中扮演的角色是負責儲存暫時性的資料
PHP的變數一律都是使用「$」開頭,後面緊接著變數名稱
在PHP中,使用變數不需要事先宣告
如果要使用變數,直接用$變數 = 值;
,給一個變數名稱,然後指定該變數的值就可以了
「=」在這邊不是等於的意思,而是「指派運算符號」
意思是將右邊的值指派給左邊的變數,讓左邊的變數記住右邊的值
<?php
$language = "PHP";
$practice = "Hello world";
?>
這邊要注意一下,只宣告變數,而沒有給變數儲存值,PHP會視為沒有這個變數
這是因為「給變數值」這個動作在PHP內,就是在初始化變數,而所有有宣告但未初始化的變數,在PHP內都視為NULL
<?php
error_reporting(E_ALL);
echo $i; //這邊會是null
$i = 'value';
echo $i;
?>
第一行的error_reporting(E_ALL);
的意思是跟PHP說,我要印出所有的Error/Warning/Notice
由於有些環境預設只會出現Error提醒,Notice和Warning不會顯示,所以才需要多這一行
有興趣想了解更多可以參考開發時 Error Reporting 永遠使用 E_ALL這篇文章
上面的程式碼一般來說會顯示
Notice: Undefined variable: i in 檔案路徑/test.php on line 2
value
變數命名規則
在PHP中,變數一律都是使用「$」開頭後面緊接著變數名稱
變數名稱的開頭必須為(開頭不能是數字)英文字母(A-Z & a-z)
底線(_)
後面可以接長度不限的英文字母、數字或是底線
PHP的變數名稱有大小寫之分
舉例來說,$Hello
、$hello
、$HELLO
是三個不同的變數變數命名的一致性
一致性指的是程式內變數命名的表示方式是否都相同,保持變數命名的一致性,能降低程式出錯的機會由於有時候有意義的名稱可能需要兩個或以上的單字所組成
所以發展出不同的名稱表示方式
舉例來說,「店家名稱」我們可以用以下的方式表示$shop_name(底線分隔)
$shopName(駝峰式命名)
$ShopName(大駝峰命名)
變數命名的例外
$this
看起來像是一個變數,但是在PHP的語法中,$this
因為有其他的的用處,是無法被指定值的
所以不能用$this
來命名變數
變數作用範圍
每個PHP的變數都有自己的變數作用範圍
變數作用範圍就是當程式執行時,變數可以讓函數內或其他程式碼存取的程式碼範圍
程式中我們可能會在不同的位置,用到相同的變數名稱,表示不同的東西,如果變數沒有範圍就可能會互相干擾。所以在程式中,會有不同的變數範圍,當程式離開這個範圍之後,屬於此範圍的變數就會清除。
PHP中分為全域變數和區域變數,基本上依照下述的原則:
- 在function中的變數為區域變數。
- include中的變數範圍與呼叫include的所在範圍相同。
- 其他為全域變數。
舉例來說,有個variable.php
檔案有以下的程式碼
<?php
$var = 10;
?>
這裡的$var
變數只有在variable.php
裡面能使用,除非variable.php
有被其他檔案所引入,否則其他的php檔案無法使用$var
這個變數
所以我們說$var
的變數作用範圍是整個variable.php
檔案
PHP的每個變數都有自己唯一的變數作用範圍,而變數作用範圍有分三種
- 區域變數(local varialbe)
在函數內部的變數、函數的參數都是區域變數
區域變數只能在函數內使用,在函數外面的程式碼無法存取到函數內的區域變數
- 全域變數(global variable)
如果變數是在函數外面宣告,除了函數內部以外,整個PHP檔案的其他部分都可以存取這個變數
而PHP全域變數如果在函數中需要使用,需要宣告成「global
」
- 靜態變數(static variable)
函數中一般的區域變數,在函數執行結束之後,變數使用完畢就會消失
但因為靜態變數有配置固定的記憶體空間儲存資料,所以當函數執行完,靜態變數所儲存的值不會消失
而靜態變數一定在函數內,所以靜態變數也是一種區域變數
這邊用以下幾個範例來示範全域變數跟區域變數的區別,以及怎麼在函數內使用區域變數
如果不太了解函數是什麼的話,可以看看函數-function再回來繼續往下看
<?php
//在函數內想使用外部的全域變數
$a = 10;//$a是全域變數
printA();
function printA(){
echo '$a:'.$a;
}
?>
複製下來存成scope.php
執行之後,會在瀏覽器裡面顯示
Notice: Undefined variable: a in 檔案路徑/scope.php on line 6
意思是在檔案內的第六行echo '$a:'.$a;
,這邊的$a
這個變數是沒有定義過的
為什麼沒有定義過呢?在第二行不是就有了嗎?
這是由於在PHP函數內部,是無法存取外面的全域變數的,所以在printA()
函數內,無法找到$a
這個變數
那如果還是需要在函數使用$a
怎麼辦呢?我們可以這樣寫
<?php
//使用global,讓函數內部能夠存取外部的全域變數
$a = 10;
printA();
function printA(){
global $a;
echo '$a:'.$a;
}
?>
在printA()
裡面使用global
代表需要再函數裡面使用外部的全域變數,這樣就可以順利存取$a
了
在這邊再附上一個比較的範例給大家看看
<?php
$a = 10;
$b = 20;
function A(){
//這邊的$a,$b是function A內的區域變數
$a = 1;
$b = 2;
}
function B(){
global $a,$b;//宣告需要存取的全域變數
$a = 3;
$b = 4;
}
echo '初始值 $a:'.$a.' $b:'.$b.'<br>';
A();
echo 'call function A - $a:'.$a.' $b:'.$b.'<br>';
B();
echo 'call function B - $a:'.$a.' $b:'.$b.'<br>';
?>
輸出結果
初始值 $a:10 $b:20
call function A - $a:10 $b:20
call function B - $a:3 $b:4
前面是解釋全域變數與區域變數的差異
這個範例是用來了解靜態變數的用法,以及使用起來的效果
下面範例中的noStatic()
和useStatic()
函數運算內容都是將區域變數的值+1
但useStatic()
內的區域變數$count
是宣告成static
的
<?php
function noStatic(){
$count = 0;
$count = $count + 1;
return $count;
}
//靜態變數的宣告就是在function內的變數前面加上static即可
function useStatic(){
static $count = 0;
$count = $count + 1;
return $count;
}
echo noStatic(); //output:1
echo noStatic(); //output:1
echo noStatic(); //output:1
echo useStatic(); //output:1
echo useStatic(); //output:2
echo useStatic(); //output:3
?>
可以看到結果,沒有使用static
的變數每次都會被歸0,使用static
的變數,值在函數結束之後會被儲存起來保留
下次執行同樣的函數時不會被歸0重新計算
可變變數
可變變數是一個滿酷的用法,適當使用可以增加程式的開發效率
可變變數就是「把變數的名稱變成變數」,看起來頭很暈對吧哈哈
直接來看程式碼
<?php
$num1 = 100;
$numString = "num1";
echo ${$numString};//也可以寫成$$numString
?>
這段程式碼最後會輸出100
原因是$numString
的值是num1
,將$numString
的值取出放進大括號中,程式就變成了${num1}
再把大括號拿掉就變成了$num1
,而$num1
的值就是100,所以最後輸出100
這就是可變變數的特性與用法 -「把變數的名稱變成變數」
而${$numString}
這樣的寫法也能把大括號拿掉直接寫$$numString
,有沒有大括號都可以正常運作
一般來說可變變數 會搭配陣列做使用,之後會再介紹其它用法
超級全域變數
從PHP4.1.0版本開始,PHP就內建了一系列的預設全域變數,稱為超級全域變數
這些超級全域變數每個都是一個陣列,能讓開發者存取許多不同的值
而超級全域變數的特性是可以在任何地方被使用,就算在函數內也不需要用global
宣告就能使用
接下來簡單介紹一下PHP中的超級全域變數,只要知道有哪種超級全域變數,看過就可以了,
- $GLOBALS
用來記錄各種全域變數的一個陣列
- $_SERVER
取得網頁伺服器的相關設定值時會用到
例如$SERVER['PHP_SELF']
可以取得目前檔案的位置與名稱
- $_GET
取得用HTTP GET傳遞到Server的資訊
- $_POST
取得用HTTP POST傳遞到Server的資訊
- $_COOKIE
取得用HTTP內的COOKIE
- $_REQUEST
$_REQUEST = $_GET + $_POST + $_COOKIE
簡單來說就是$_REQUEST
把前面三個都包含了
- $_FILES
網頁常常可以有上傳檔案的功能,PHP可以使用$_FILES
來獲得被上傳檔案的相關資訊
像是$_FILES['name']
檔案名稱、$_FILES['type']
檔案類型、$_FILES['size']
檔案大小等等
- $_ENV
用來存取PHP的環境變數
- $_SESSION
用來存取Server中的Session
ps.Cookie和Session很像,只是差別在存在的地方不一樣,Cookie是存在client端,Session是存在server端
除了以上這些,其實還有許多其他的超級全域變數,不過初學者不常用,先知道這些即可