變數

變數在程式中扮演的角色是負責儲存暫時性的資料

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中,變數一律都是使用「$」開頭後面緊接著變數名稱
    變數名稱的開頭必須為(開頭不能是數字)

    1. 英文字母(A-Z & a-z)

    2. 底線(_)

    後面可以接長度不限的英文字母、數字或是底線

  • PHP的變數名稱有大小寫之分
    舉例來說, $Hello$hello$HELLO 是三個不同的變數

  • 變數命名的一致性
    一致性指的是程式內變數命名的表示方式是否都相同,保持變數命名的一致性,能降低程式出錯的機會

    由於有時候有意義的名稱可能需要兩個或以上的單字所組成
    所以發展出不同的名稱表示方式
    舉例來說,「店家名稱」我們可以用以下的方式表示

    • $shop_name(底線分隔)
    • $shopName(駝峰式命名)
    • $ShopName(大駝峰命名)

變數命名的例外

$this看起來像是一個變數,但是在PHP的語法中,$this因為有其他的的用處,是無法被指定值的
所以不能用$this來命名變數

變數作用範圍

每個PHP的變數都有自己的變數作用範圍
變數作用範圍就是當程式執行時,變數可以讓函數內或其他程式碼存取的程式碼範圍

程式中我們可能會在不同的位置,用到相同的變數名稱,表示不同的東西,如果變數沒有範圍就可能會互相干擾。所以在程式中,會有不同的變數範圍,當程式離開這個範圍之後,屬於此範圍的變數就會清除。

PHP中分為全域變數和區域變數,基本上依照下述的原則:

  1. 在function中的變數為區域變數。
  2. include中的變數範圍與呼叫include的所在範圍相同。
  3. 其他為全域變數。

舉例來說,有個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端

除了以上這些,其實還有許多其他的超級全域變數,不過初學者不常用,先知道這些即可

results matching ""

    No results matching ""