1.2PHP變量

       變量是用於臨時存儲值的容器。PHP最基本的數據存儲單元是變量和常量。
       PHP是弱類型語言,在聲明變量或者常量的時候,數據類型根據程序上下文決定,由於這個原因,使PHP和其他一些強類型語言(C、Java)有很大不同,也因此PHP可以更快的入門。
1、變量的聲明
1)變量創建
PHP特性之一就是在使用變量之前,不要求聲明變量。當你第一次給一個變量賦值時,你才創建了變量。一旦創建了一個變量,你可以在腳本中重複使用。在php中聲明一個變量需要在變量名前跟一個“$”符號。
eg1:
相信你一眼就能看懂下邊的代碼。

<?php
    $a = 123;
    $b = 456;
    $c = $a;
    $a = $b = "abc";
    echo $c;
    echo $a;

上例將會輸出“123abc”。
2)變量使用範圍
變量範圍就是變量的生效範圍。大部分的變量如果不是在函數裏邊聲明的,這個變量在聲明處到文本結束的小範圍內有效,這個“小範圍”不是<?php ?>開始和結束範圍,還包括include和require的文件。還有另外一種叫全局變量,如COOKIE和SESSION可以在所有頁面中使用。
在變量的使用範圍內,可以用unset()函數釋放指定變量(內存中釋放),使用isset()來判斷某個變量是否存在,empty()來判斷某個變量是否爲空。這幾個函數,在我們寫業務代碼時經常用到。
#易混淆點
empty()和isset()區別:
如果empty()的參數是非空或者非零的值時,則返回false,否則返回true;如果isset()參數存在,則返回true,否則返回false。
需要注意的是:
“”,0,“0”,NULL,false,array(),var $var empty()判斷這些值時返回的都是true(var 定義變量是在類中使用的,相當於public,不在類中使用會報錯,反之,在類中定義變量不定義屬性(public、protected、private),也會報錯)。另外一個NULL字節("\0")並不等同於PHP的NULL常數。
②isset()判斷被unset()處理後的變量返回的是false。
③推薦使用!empty($var)判斷某個變量存在且不爲空。
④網上及相關資料說沒有任何屬性的對象,empty()會返回true,但實際情況是返回的是false。查了很多資料,說是php4版本會返回true,具體情況得測試之後才知曉。

eg2:下邊舉例了絕大部分例子

<?php
    $var1 = '';//test1輸出1,test2輸出3
    $var2 = ' ';//test1輸出2,test2輸出3
    $var3 = 0;//test1輸出1,test2輸出3
    $var4 = '0';//test1輸出1,test2輸出3
    $var5 = null;//test1輸出1,test2輸出4
    $var6 = false;//test1輸出1,test2輸出3
    $var7 = array();//test1輸出1,test2輸出3

    class a{};
    $var8 = new a();//test1輸出2,test2輸出3
    $var9 = (object)null;//test1輸出2,test2輸出3
    $var10 = new StdClass();//test1輸出2,test2輸出3,此方法也是創建一個空對象

    $var11 = 'this is a test';
    unset($var11);//test1輸出1,test2輸出4
    $var12;//test1輸出1,test2輸出4
    $var13 = "/0";//直接var_dump($var13)會打印出string''(length=1),但是test1輸出的是2,test2輸出的是3,這裏涉及到null和null字節("\0")不相等。
    $var14 = '/0';//直接var_dump($var14)會打印出'/0',test1輸出的是2,test2輸出的是3,這裏$var13和$var14涉及到反斜槓轉義

    function test1($var){
        if(empty($var)){
            echo 1;
        }else{
            echo 2;
        }
    }
    function test2($var){
        if(isset($var)){
            echo 3;
        }else{
            echo 4;
        }
    }
    test1($var1);//可以改變參數$var1來測試其他情況,下同
    test2($var1);

2、變量的命名
變量名是嚴格區分大小寫的,但是內置結構和關鍵字以及用戶自定義的類名和函數名都是不區分大小寫的。例如echo、while、class 名稱、function 名稱等都可以任意大小寫。
eg: echo 1;與ECHO 1;是一樣的。

變量命名規範:
①變量名嚴格區分大小寫
②變量名以字母或者下劃線開頭,後面跟上任意的數量的字母、數字或者下劃線。
③變量名不能以數字開頭,中間不可以有空格,不能使用點分開
④php中有一些標識符是系統定義的,即關鍵字。不能用這些關鍵字作爲常量名、函數名、類名。但是可以使用這些關鍵字作爲變量名,例如$echo,但是容易混淆,最好不要使用。
⑤一般變量命名都是有一定含義的,便於代碼理解。一般多個單詞構成的變量名,第一個單詞全部小寫,後邊的每個單詞首字母採用大寫。eg:$aaaBbbCcc

3、可變變量
一個變量的名字是變量,即可變變量。
eg:
這個例子說

<?php
    $a = 'hello';
    $$a = 'world';
    echo $$a;//輸出world
    echo $a.$$a;//輸出helloworld,其中“.”是php的拼接符
    echo "$a $$a";//輸出hello $hello,雙引號會解析變量
    echo "$a ${$a}";//輸出hello world

4、變量的引用賦值
引用賦值對初學者來說,相對比較難以理解,這裏使用一個例子解釋。
eg:假定$a的值爲1,將$a的值引用賦值給$b,然後當你改變$a或者$b的值爲2時,這時$a$b都將變爲2。

代碼:

<?php
    $a = 1;
    $b = &a;
    $b = 2;
    //$a = 2;註釋$b=2,給$a賦值,結果一樣
    echo $a.$b;//輸出22

從上面代碼中可以看到,引用賦值用的是符號“&”,其$b引用了$a,可以理解成$b引用了$a的存值的地址,而不是複製其$a值得操作,從而這種賦值操作更加快速,也可以理解成$b$a的別名。但是隻有在密集的循環中或者對很大的數組或者對象賦值時,纔有可能注意到速度的提升。
注意事項:
①只有有名字的變量名纔可以引用賦值。
②表達式不能作爲引用賦值
③與C語言的地址指針不同的是,$a$b在內存上並不是同體,只是把各自的值相關聯起來。所以使用unset()其中一個變量,並不會導致另一個變量消失

<?php
    $a = 1;
    $b = &a;
    //$b = &(2*2);//引用賦值無效,不能將表達式作爲引用賦值,會報錯
    function test(){
        retrn 3;
    }
    //$b = &test();//引用賦值失敗,會報錯
    unset($a);
    echo $b;//輸出1

5、變量的類型
PHP是弱類型語言,其類型是根據存儲的數據決定的。var_dump()可以查看變量類型,php中支持8種原始類型數據。
①標量類型:布爾型(boolean)、整型(int)、浮點型(float,也稱作double)、字符串(string)
②複合型類型:數組(array)、對象(object)
③特殊類型:資源(resource)、NULL

1)布爾型
true或者false,即“真”或“假”。php進行關係運算(比較運算),以及邏輯運算時,返回true或false。
在php中一些情況下,需要一個boolean型值時,會自動轉爲布爾型,例如if(){},此時任何類型的值,在if判斷中都會轉換爲布爾型。
以下會被轉換爲false,其他只會被轉換爲true
①false(字符串‘false’會被認爲是true)
②整型值0,浮點型值0.0
③空白字符串(即”,不是’ ‘),字符串‘0’
④空數組(array())
⑤沒有單元的對象(僅適用於php4)
⑥null(包括未被設定的變量)

eg:

<?php
    $a;
    $b = (object)null;//空對象
    var_dump((bool)false);//輸出false
    var_dump((bool)'false');//輸出true
    var_dump((bool)0);//輸出false
    var_dump((bool)'0');//輸出false
    var_dump((bool)0.0);//輸出false
    var_dump((bool)'0.0');//輸出true
    var_dump((bool)'');//輸出false
    var_dump((bool)' ');//輸出true
    var_dump((bool)array());//輸出false
    var_dump((bool)null);//輸出false
    var_dump((bool)$a);//輸出false
    var_dump((bool)$b);//輸出true,php7環境

2)整型
整型即整數,除了10進制以外,還有8、16進制也有整型。
①8進制,數字前需要加指定符號“0”,eg: echo $a = 0123;會輸出83
②16進制,數字前需要加指定符號“0x”,eg:echo $b = 0xA;會輸出10
整型有最大值和最小值範圍,這個與平臺有關。32位的操作系統,最大值整數位2^(32-1)-1,最小值是-2^(32-1),因爲php不能像其他語言那樣將整數變成正數,即前面都是含有符號(“+”和“-”),所以最大值和最小值都要2的(32-1)次方。
在php中,如果給一個變量的值大於最大值或者小於最小值,則會被php解釋爲float。
eg:var_dump(12345678912345678912),會輸出float(1.23456789123456E+19);var_dump(1);會輸出int(1)

3)浮點型
浮點型是包含小數的部分的數。浮點數只是一個近似值,例如使用浮點數表示2,該數值內部表示其實類似1.99999….,所以不要相信浮點數結果精確到了最後一位,也不要比較兩個浮點數是否相等,這一點很重要,因爲在碼代碼過程中,可能涉及到金錢,因此造成損失。如果需要更高精度,應該使用任意精度數學函數或者gmp()函數。浮點數的字長也是跟平臺相關的,精度在小數點後15位
eg:

<?php
    $a = 0.1*100;
    $b = 10;
    var_dump($a<$b);//輸出true
    var_dump($a == $b);//輸出false

    $a = 0.1*100;
    $b = 0.10000000000000001*100;
    var_dump($a == $b);//輸出true

如果非要比較兩個浮點數大小,那麼只能在精度範圍內比較。以下是一些比較兩個浮點數的方法。

<?php
// are 2 floats equal
function floatcmp($f1,$f2,$precision = 10) 
{
    $e = pow(10,$precision);
    $i1 = intval($f1 * $e);
    $i2 = intval($f2 * $e);
    return ($i1 == $i2);
}

// is one float bigger than another
function floatgtr($big,$small,$precision = 10) 
{
    $e = pow(10,$precision);
    $ibig = intval($big * $e);
    $ismall = intval($small * $e);
    return ($ibig > $ismall);
}

// is on float bigger or equal to another
function floatgtre($big,$small,$precision = 10) 
{
    $e = pow(10,$precision);
    $ibig = intval($big * $e);
    $ismall = intval($small * $e);
    return ($ibig >= $ismall);
}

另外,在浮點數運算中,也是需要注意的,因爲計算機計算是將數值轉換成二進制計算的,而二進制中,你看似有窮的小數, 在計算機的二進制表示裏卻是無窮的。在計算浮點數時,可以將其計算結果先轉換成轉換成string類型。
這個網址有詳細講解其中原因:http://www.jb51.net/article/80734.htm

eg:

<?php
    var_dump((int)(0.58*100));//輸出57,這與二進制有關,因爲二進制中0.58是無限延長的值
    var_dump((int)(string)(0.58*100));//輸出58
    $a= 0.58;
    var_dump(intval(strval($a*100)));//輸出58

4)字符串
PHP沒有對字符串大小強加實現範圍,不必擔心字符串長度。字符串可以用單引號、雙引號、邊界符三種方式定義,功能各不相同。
①單引號
單引號中不能再包含單引號,會發生錯誤,必須要在單引號中含有單引號,可以用反斜線(\)轉義。如果在單引號之前或字符串結尾需要出現一個反斜線,需要用兩個反斜線表示。
另外,單引號不會解析其中的變量,會原樣輸出,所以沒有特別需求情況下,使用單引號定義字符串效率會更高,因爲php在解析時省去了處理字符轉義和變量上的開銷。

eg:

<?php
    //單引號中如果需要再包含單引號,需要使用轉義字符“\”
    echo 'this is a \'apple\'';//輸出 this is a 'apple'
    //單引號中不會轉義其他轉義符
    echo 'this \n is \t a apple \\';//輸出this \n is \t a apple \
    //不會轉義變量
    $a = 1;
    echo '$a';//輸出$a

②雙引號
雙引號會解析其中的變量及轉義字符,另外,複雜的語法可以用花括號({})括起一個表達式。如果想指定變量名字的結束,可以用{}括起來。

eg:

<?php
    $var = 1;
    //因爲(')在變量名中是無效的
    echo "$var's";//輸出1's
    echo "{$var}s";//輸出1s
    //{}指定變量名結束
    echo "${var}s";//輸出1s

③定界符
通常用於從文件或者數據庫中大段地輸出文檔,幾乎不用。
語法:使用“<<<”,在<<<後提供一個標識符開始,並以同樣的標識符結束。
注意事項:
標識符命名規則和變量命名規則一樣,只能含有字母、下劃線、數字,且必須以下劃線或者非數字字符開始。
標識符必須從行的第一列開始,後邊除了分號以外不能包含任何其他字符、空格、空白製表符。
定界符不能初始化類成員,其他與雙引號表現的一致。
eg:

<?php
    $string=<<<TEST
        結尾的ETO一定要頂頭,在本行第一列,不然會如同雙引號沒有閉合,而且連註釋都不能寫\n
        123
TEST;
echo $string;
//初始化類成員,以下會報錯
class test{
    public $a = <<<TEST
        123
TEST;
}

5)數組
數組是php重要的複合型數據類型。前面所說的類型都是標量類型,只能存儲一個數據,數組可以存儲多個數據,而且可以存入任何類型的數據。
由於數組知識點較多,這裏暫做簡單介紹,後邊會專門說明。
數組的格式如下:
eg:

<?php
    /*
        array(
            key1=>value1,
            key2=>value2,
            ...
        )
        key可以是string或者int
        value可以是任意值
    */
    $a = array("a"=>1,2=>"b");

6)對象
在php中,對象是比數組更高級的複合數據類型,一個對象是由一組屬性值和一組方法構成的。初始化一個對象,用new語句講對象實例化到一個變量中,這裏只做簡單介紹和示例。
eg:

<?php
    class a{
        public $b;
        public function c(){
            echo 123;
        }
    }

    $p = new a();//實例化類a,創建對象。
    $p->b = '345';//訪問對象中的屬性
    $p->c();//訪問對象中的方法

7)資源類型
8)NULL類型
null類型唯一的值時null,不區分大小寫,表示一個變量沒有值,null既不表示空格,也不表示0,也不是空字符串,而是一個變量的值爲空。以下三種情況被認爲是空。
①變量的值被設置爲null
②聲明的變量沒有賦值
③被unset()函數銷燬的變量
9)僞類型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章