PHP

PHP 基礎

1. php 簡介

PHP,即 PHP: Hypertext Preprocessor,是一種被廣泛應用的開源通用指令碼語言,尤其適用於 Web 開發並可嵌入 HTML 中。
它的語法利用了 CJavaPerl,易於學習。
該語言的主要目標是允許 web 開發人員快速編寫動態生成的 web 頁面,但 PHP 的用途遠不只於此。

2. php 概述與名詞解釋

2.1 基本語法與名詞解釋

php標記:當 php 開始解析一個檔時,會尋找起始和結束標記,也就是 <?php 和 <font
color=’red’>?>。
這告訴 php 開始和停止解析二者之間的代碼。
此種解析方式使得 php 可以被嵌入到各種不同的文檔中,而任何起始和結束標記之外的部分都會被 php 解析器忽略。

分隔符號: php 需要在每個語句後用分號;結束指令,需要注意的是必須採用英文輸出。
注釋方法: php 的注釋雖然支持 cc++unix shell 風格等的注釋方法,但我們仍然保持在 js 中的注釋風格即可,其餘注釋方法暫且不提。
輸出方法: echo 命令表示輸出,而寫在 echo 後面的代碼能夠直接被顯示出來。

2.2 變數

  • 描述:變數是其所表示的值可以發生改變的量,
    在 php 中的變數用一個美元符號後面跟變數名來表示。
  • 語法$變數名稱
  • 規則:變數名稱與 php 中其它的標籤一樣遵循相同的規則。
    一個有效的變數名由字母或底線開頭,後面跟上任意數量的字母,數位,或底線。
  • 注意
    (1) php 中變數名稱是大小寫敏感
    (2) php 中變數可以直接在寫出變數名稱後直接使用,而不需要 js 中的 “聲明賦值”過程。
    (3) php 中變數之間的賦值總是【賦值傳遞】,如果必須【地址傳遞】則需要使用 & 符號
    (4) php 中變數的作用域採用函數級作用域(暫時)。
  • 例子:
    $var='allen';
    $Var=' welcome!';
    echo "$var,$Var";  // 輸出 "allen welcome!"
  • 動態變數 Variable variables

    剛接觸 PHP 的人一定會覺得很奇怪,會什麼變數(variables)前面都要帶 $ 為什麼不像 java 或者其他語言,變數名直接拿來用呢? 後來才知道 PHP 支援 Dynamic variables 動態變數 i.e variable variables 的功能。

    <?php
    $hello = 'world';
    $world = 'hello';
    
    echo $world . "n"; //輸出: world
    ?>

    PHP 會把 ${$world} 的值拿出來替換,因此變數成為 $hello,所以 output 就是 ‘world’ 字串。但太多的 $...$ 轉換會造成代碼理解的困難。

    例如:

    <?php
    $Bar = "a";
    $Foo = "Bar";
    $World = "Foo";
    $Hello = "World";
    $a = "Hello";
    
    echo $a; //輸出: Hello
    echo $a; //輸出: World
    echo $$a; //輸出: Foo
    echo $$a; //輸出: Bar
    echo $$$a; // 輸出 a
    echo $$$a; //輸出: Hello
    echo $$$$a; //輸出: World
    :
    //..... 等 ....//
    ?> 

    後面維護的人員應該會想罵人吧~~

    何時使用動態變數

    for-loop 中最常使用到動態變數 Variable variables,例如: php_動態變數.php

    <?php
    // price name list
    $priceNameList = array('Original', 'VIP', 'Employee');
    
    // price list
    $priceList = array(300, 200, 100);
    $total = count($priceList);
    // dump priceList to meaningful variable name;
    for ($i=0; $i < $total; $i++) {
      //動態變數名稱 $priceOriginal,$priceVIP,$priceEmployee
      ${'price'.$priceNameList[$i]} = $priceList[$i];
    }
    
    echo 'oringial price: ' . $priceOriginal . "n";
    ?>

2.3 常數

  • 描述:常數指在腳本執行期間該值不能改變的識別字。
    常數預設為大小寫敏感,傳統上常數識別字總是大寫的。
  • 語法define(‘常數名稱’, ‘簡單值’);
  • 規則:常數名稱和其它任何 PHP 標籤遵循同樣的命名規則。
    合法的常數名稱以字母或底線開始,後面跟著任何字母,數位或底線。
  • 注意
    (1) 常數實際上可以認為是【巨集定義】在php中的一個體現
    (2) 為了區分變數和常數,我們約定常數在定義時均使用大寫
    (3) php 中實際上並不是所有的常數的值都不能改變,MC(魔術常數)就能夠發生改變。
  • 例子
    define('FRANK', '沃德田·辣麼帥');
    echo FRANK;

    魔術常數: 這些常數的值會隨著它們在代碼中的位置改變而改變,這些魔術常數不區分大小寫,如下:

    魔術常數 說明
    LINE 取得運行程式的行號。
    FILE 取得文件在本機的路徑與檔名。
    DIR 取得文件在本機的路徑。除非是根目錄,否則目錄路徑名稱不包括最後的「/」符號。(PHP 5.3新功能)
    FUNCTION 取得函數的名稱(PHP 4.3.0 新增)。自PHP 5 起返回的函數名稱即是原定義名稱,英文字母區分大小寫。
    CLASS 取得類別名稱(PHP 4.3.0 新增)。自PHP 5 起返回的類別名稱即是原定義名稱,英文字母區分大小寫。
    METHOD 取得類別的方法名稱(PHP 5.0.0 新增)。返回的方法名稱即是原定義名稱,英文字母區分大小寫。
    NAMESPACE 取得區分大小寫的命名空間名稱(PHP 5.3.0 新增)。
  • 範例magicConst.php

2.4 運算式

  • 描述:運算式是 php 中的基石,可以說在 php 中縮寫的任何內容都是運算式。
    官方給出的概念是【任何有值的東西均可以稱為是運算式】
  • 語法:在 php 中運算式無法精確的被給出一個語法來設定,但可以簡單設立一個通俗的標準。
    那就是語句如果不加分號的部分,就是運算式。
  • 注意
    上面的說法並不完全準確,畢竟有一些語句是不使用分號結尾的。
    例如流程控制中的 if 等結構,還有函數等結構。
    因此上面的說法只是 “簡單” 設立的一個標準。
  • 例子
    function foo(){ return 5;} //函數運算式
    $c = $a++;                 //賦值運算式

3. php 常見資料類型

php 中的資料類型相較於 js 多了很多種,但其中相當一部分對於我們來說鮮少用到。因此我們只在這為大家介紹常見的幾種資料類型。
介紹資料類型之前,為大家提供兩個方法來判別變數的資料類型:
var_dump(變數|運算式):函數用來查看運算式的值和歸屬類型。
gettype(變數|運算式):函數用來查看變數或運算式的類型。

3.1 布林類型:Boolean

  • 描述: boolean 是最簡單數值型別,用來表示運算式的真值。
  • 語法 一般使用TRUEFALSE常數來指定布林值,兩者均不區分大小寫
  • 注意
    a. 可以使用 (bool) 或<font
    color=’red’> (boolean) 強制轉換修飾符,來對非布林數值型別的變數或運算式進行強制類型轉換。
    b. 當轉換為布林數值型別時,以下值被認為是 FALSE

    • 布林值 FALSE 本身
    • 整型值 0(零)
    • 浮點型值 0.0(零)
    • 空字串,以及字串 “0”
    • 不包括任何元素的陣列
    • 特殊類型 NULL(包括尚未賦值的變數)

    c. 所有其它值都被認為是 TRUE(包括任何資源 和 NAN)

  • 強調
    -1 和其它非零值(不論正負)一樣,被認為是 TRUE

3.2 整數類型:Integer

  • 描述:整數指的是集合 ℤ = {…, -2, -1, 0, 1, 2, …} 中的某個數
  • 語法
    a. 整數值可以使用十進位,十六進位,八進制或二進位表示,
    前面可以加上可選的符號(- 或者 +)。
    b. 二進位表達的 integer 自 PHP 5.4.0 起可用。
    c. 要使用八進制表達,數位前必須加上 0(零)。
    要使用十六進位表達,數位前必須加上 0x
    要使用二進位表達,數位前必須加上 0b
  • 注意
    a. PHP7 以前的版本,如果向八進位數傳遞了一個非法數字(即 8 或 9),
    則後面其餘數字會被忽略。PHP7 以後,會產生 Parse Error 錯誤
    b. PHP 中沒有整除的運算子。 1/2 產生出 float 0.5。
    c. 使用(int)或<font
    color=’red’>(integer)方法對非整數變數或運算式進行強制類型轉換
  • 強調
    絕不要將未知的分數強制轉換為 integer,這樣有時會導致不可預料的結果。

3.3 浮點類型:Float

  • 描述:浮點類型,又被稱為浮點數 Float或者雙精度數 double 或者實數 real。
  • 語法:可以通過一下任何一種類型來定義
    $a = 1.234;
    $b = 1.2e3;
    $c = 7E-10;
  • 注意
    a. 永遠不要直接比較兩個浮點數的大小,因為這樣沒有任何意義
    b. 如果必須比較浮點數大小,則可以採用【epsilon】機器極小值方式進行比較。
    c. NAN表示數學上無法用浮點數具體描述出的數字,
    和true之外的任何值進行鬆散或嚴格比較的結果都會是false。
  • 強調
    由於 NAN 代表著任何不同值,不應拿 NAN 去和其它值進行比較,包括其自身 。

3.4 字元類型:String

  • 描述:字元類型也叫字串類型,是由一系列字元構成。
    其中每一個字元等同於一個位元組,因此 php 中只能支援 256 字元集,
    也正因為這樣其不支持 Unicode
  • 語法:php 中字串有兩種定義語法,單引號雙引號定義。
  • 注意
    a. php 字串中使用轉義字元來描述容易引起歧義的內容
    b. php 對雙引號定義的字串中的變數可以進行內容解析,而單引號則不行。
    c. php 字串允許多行定義,但會忽略多餘的空格和換行。
    d. php中字串拼接採用 . 點運算子實現! 不是 + 加號
  • 例子
    $frank = '張先森';
    echo 'my name is $frank'."<br/>";
    echo "my name is $frank";
  • echoprint 的差異
    1. 比較 printecho 函式的執行速度差異。

      print.vs.echo

      結果:
      Use 'echo': 0.065550088882446
      Use 'print': 0.080870151519775

    2. printecho 兩個函數的用法差異。
      • PHPechoprint的功能基本相同(輸出),但是兩者之間還是有細微差別的。
        echo 輸出後沒有返回值,但 print 有返回值,當其執行失敗時返回 flase。 因此可以作為一個普通函數來使用。
        這意味著 print 可用在一些複雜的運算式中,而 echo 則不行。但是,因為 echo 語句不要求返回任何數值,所以在代碼中 echo 語句的運行效率要略微快於 print 語句。
      • echo 可以輸出多個字串,像下面這樣:
        echo 'a','b','c';echo ('a'),('b'),('c'); 但不可為 echo ('a','b','c');
      • print 只能輸出一個字串,它可以表現得像一個函式,比如你可以如下使用:
        echo $r = print "Hello World "; 成功印出 “Hello World ” 後會再接收到一個值 1
      <?php
      $a='hello ';$b='php world!';echo $a,$b.'<br />';//echo 可以用逗號分隔字串變數來顯示
      print $a.$b.'<br />';//而print不能使用逗號,只能用點號分隔,
      //print $a,$b.'<br />';//這裡使用逗號時報錯。
      ?>
heredoc

一般 PHP 會將要輸出的 HTML 用單引號或雙引號包起來,單引號和雙引號的差異是在雙引號內可以使用 PHP 變數,單引號則不行。

但是如果很長的一段 HTML,會顯得程式碼不易維護,此時可以使用 heredoc 語法,

  • 例子
    <<<EndOfDoc
    <!DOCTYPE html>
    <html>
    <head><title>TITLE</title></head>
    </html>
    EndOfDoc;

使用 <<< 語法要特別注意的是:

  • EndOfDoc 是標籤名稱可自定,但上下要一樣
  • 開始標籤名稱可加單引號或雙引號,加單引號後其內容不支援 PHP 變數,加雙引號與不加雙引號是相同的功能。
  • 開始的標籤名稱後面不可有任何字元,包括空白。
  • 結束的標籤名稱要使用分號結尾,前後都不得有空白。
  • 例子
    <?php
    $myLanguage = "PHP";
    
    $ShowStr = <<<Msg
               我最喜歡的網頁程式語言是: $myLanguage <br />
               許多學生都說: "It's easy, It's good."
    Msg;
    echo $ShowStr;
    ?>
nowdoc

若要在頁面上顯示程式的原始碼,就須改用 nowdoc 語法(PHP 5.3 新增),表示方法的結構
heredoc 相同,不同的是 nowdoc 對於內容中變數及跳脫字元不會進行編譯,而是直接顯示字串內容。

  • 格式
    $變數名稱 = <<<'自訂名稱'
             字串內容...........
             ...............
    自訂名稱;

注意
nowdoc 語法結構表示法定義字串時,起始的自訂名稱前後要加上單引號 ', 結尾的自訂名稱就不用。

  • 例子
    <?php
    $myLanguage = "PHP";
    
    $ShowStr = <<<'Msg'
              我最喜歡的網頁程式語言是: $myLanguage <br />
              許多學生都說: "It's easy, It's good."
    Msg;
    echo $ShowStr;
    ?>

3.5 陣列類型:Array

  • 描述:php 中的陣列實際上一個有序映射,映射就是把 keys 關聯到 values上的類型。
  • 語法
    array( key => value , … )
    // 鍵(key)可是是一個整數 integer 或字串 string
    // 值(value)可以是任意類型的值 。
    php 5.4 起,可以直接通過短陣列定義方式[]來替代array()。
  • 注意
    a. php 中 echo僅用來輸出簡單值,而複雜資料類型則需要通過print_r()函數來輸出
    b. php 中的陣列實際上更相似與 js中的物件結構。
    c. php 中陣列的讀取和賦值可以通過陣列名稱[鍵名]方式來讀寫。
    d. php 中陣列的長度讀取通過 count() 函數實現
    e. php 中陣列內部添加原本並不存在的 key 值,不會補齊之間的差值,
    而是僅添加當前新輸入的 key 值。例:$arr[100] = 100.並不會為陣列添加 100 個元素
  • 例子
    print_r($frank = ['11','22','33']);
    print_r($frank[0]);
    $frank[100] = 960;
    print_r($frank);
    echo count($frank);

3.6 對象類型:Object

  • 描述: php 中想要創建一個物件,則必須通過 new 語句產生實體一個類別得到。
  • 語法$obj = new Func;
  • 注意
    a. php 中類別由 class 關鍵字聲明,類別名稱後沒有小括弧。
    b. php 中類別內部的方法由 -> 箭頭來調用,而不是 . 點運算子。
  • 例子
    class Peo{
    function eat(){
      echo '我會吃飯';
    }
    }
    $frank = new Peo;
    print_r($frank->eat());
  • 補充:對於類別和物件的使用方法遠不止如此,而在資料類型當中我們只需要知道物件類型是如何創建的即可,剩餘部分會在類別和物件中詳細說明。

3.7 空數值型別:NULL

  • 描述: NULL 表示變數未被賦值的狀態,NULL 類型唯一可能的值就是 NULL。
  • 注意: NULL 值不區分大小寫,NULL 或 null 都可以
  • 例子
    echo $a;  //Undefined variable
    $temp = null;
    var_dump($temp);  // NULL
    echo "<script>
    var a;
    console.log(a);
    </script>";
    
    var_dump($frank = NULL); //NULL

3.8 資源型別

資源通常是利用特殊的函數所傳回代表資源的值。因為資源型別的變數,其值建構的方法包含了如檔案處理、資料庫處理或繪圖處理等動作的內容,所以是無法由其他的資料型別轉換而來的。

  • 例子
    $conn = mysqli_connect("localhost:3306", "root", "1qaz@wsx");
    $conn = null;

4. php 運算子

php 中運算子和 js 中的運算子大同小異,因此整體上來講可以直接按照經驗進行使用。但畢竟存在差別,因此列出兩個明顯的運算規則區別:

4.1 字串的拼接符號不再是 + 加號運算子,而是 . 點運算子

4.2 字串內的 += 運算子號也不再表示拼接,而是使用 .= 來進行拼接

原本的 += 僅用來單純的數學運算累加。

  • 例子
    $str1 = '123';
    var_dump($str1+= '456');//int(579)
    $str1 = '123';
    var_dump($str1.= '456');//string(6) "123456"

5. php 流程控制語句

php 中流程控制語句與 js 中的流程控制語句語法基本一樣,可以直接使用。
php 中不但包括了 js 中原有的語句,還新添加了一些流程控制:

5.1 快速遍歷不再是for-in結構,而是提供了一個foreach語句

  • 描述foreach 語法結構提供了遍歷陣列的簡單方式,foreach 僅能夠應用於陣列和物件。
    如果嘗試應用於其他資料類型的變數,或者未初始化的變數將發出錯誤資訊。
  • 語法
    foreach (array_expression as $value) {    statement  }
    或者
    foreach (array_expression as $key => $value) {   statement  }
  • 注意
    a. 第一種格式遍歷給定的 array_expression 陣列。每次迴圈中,當前單元的值被賦給 $value 並且陣列內部的指標向前移一步
    (因此下一次迴圈中將會得到下一個單元)。
    b. 第二種格式做同樣的事,只除了當前單元的鍵名也會在每次迴圈中被賦給變數 $key
  • 例子
    $arr = [1,2,3,4,5];
    foreach ($arr as $index => $value) {
    echo '$arr[' . $index. ']:' . $value. "<br/>";
    }

5.2 文件引入語句 include 和 require

文件的單次引入語句 include_oncerequire_once

  • 描述includerequire 語句都表示包含並運行指定檔。
    但未找到文件 include 會發出一條警告,後者會發出一個致命錯誤
  • 語法
    include ‘檔案名稱|檔案路徑;’
  • 注意
    a. 當一個檔案被包含時,其中所包含的代碼繼承了 include 所在行的變數範圍。
    從該處開始,調用檔在該行處可用的任何變數在被調用的檔中也都可用。
    b. 不過所有在包含檔中定義的函數和類別都具有全域作用域。
  • 例子

    test.php

最後修改日期: 2023 年 11 月 22 日

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。