1. 程式人生 > 實用技巧 >PHP基礎

PHP基礎

Apache配置

安裝配置(這裡以2.4版本為例)

  • 官網下載安裝包(若官網下載十分緩慢推薦地址:http://8dx.pc6.com/xjq6/ApacheHTTPServer2433.zip)
  • 解壓到指定資料夾,修改配置檔案httpd.conf(路徑:conf --> httpd.conf)
    • ServerRoot "你的安裝目錄" (注意:這裡路徑使用反斜槓 /
    • Listen 80 (若出現埠衝突則更改當前的埠號)
    • ServerName 服務名稱 (localhost即可,埠可不帶)
    • DocumentRoot "你的安裝目錄/htdocs" (htdos為你的網路資料夾名稱)
    • <Directory "你的安裝目錄/htdocs">
  • 配置為系統服務httpd.exe -k install

檢視當前使用模組

  • 在bin目錄下使用httpd.exe -M 檢視當前使用的模組
    • static:靜態載入(隨apache啟動載入,之後可以直接使用)
    • share:動態載入(按需載入)

驗證配置檔案是否有效

  • 在bin目錄下使用httpd.exe -t 檢視當前使用的模組
  • Syntax OK :可以使用(並非無任何異常)

配置預設站點

  • 讓Apache確定伺服器上訪問的位置(也就是網路資料夾所在位置)
    • 相關配置檔案:httpd.conf
      中的 DocumentRoot欄位
  • 為方便使用為對應資料夾取別名
    • 相關配置檔案:httpd.conf 中的 ServerName欄位(埠號可以在listen欄位中配置)
  • 實現DNS域名解析(通常預設站點是本地DNS:host檔案)
    • 修改本地DNS域名解析(本地host檔案路徑:C:\Windows\System32\drivers\etc)

Tip:凡是涉及到配置修改動作時,完成後務必檢查配置檔案是否有效,並重啟服務

Tip:一般預設的localhost對應的就是127.0.0.1

PHP配置

安裝配置(這裡以7.1.4版本為例)

  • 預設apache是不能直接解析php檔案的,所以我們需要安裝php來解析php檔案

  • 下載壓縮包檔案(若官網下載十分緩慢推薦地址:http://jvniu.jb51.net:81/201704/tools/php-7.1.4-Win32-VC14-x64.zip)

  • 解壓到指定資料夾

  • 複製一份檔案 php.ini-development ,並將其名稱改為 php.ini ,修改其配置

    • extension_dir = "你的安裝路徑" (前面的分號去掉)
  • 在apache中使用,修改apache中的配置檔案 httpd.conf(路徑:conf --> httpd.conf)

    • 在末尾加上

      LoadModule php7_module 你的php所在路徑/php7apache2_4.dll
      PHPIniDir "你的php所在路徑"
      AddType application/x-httpd-php .php .html .htm
      
  • 在apache的 bin 目錄下使用httpd.exe -t 驗證是否有誤(Syntax OK 可以使用)

  • 連線mysql,只需引入響應模組,也就是去除 extension=php_mysqli.dll 前的分號啟用

  • 配置時區:date.timezone = PRC

虛擬主機

什麼是虛擬主機

  • Virtual Machine,簡單的說就是並非真實存在的主機,但是可以實現真實主機的相應功能
  • 通俗來說:虛擬主機就是將計算機中的不同資料夾進行不同的命名,然後可以實現讓伺服器(Apache)根據使用者的需求從不同的資料夾(網站)中讀取不同的內容。
  • 在Apache中可以將虛擬主機分為兩類
    1. 基於IP的虛擬主機:也就是一臺電腦使用多個IP,每個IP對應一個網站
      • 原理:一臺電腦配置多個網絡卡
    2. 基於域名的虛擬主機,單個IP製作多個網站,給每個網站不同的名字(虛擬主機名)

PHP初識

初識

  • PHP 是一種建立動態互動性站點的強有力的伺服器端指令碼語言。
  • 可以嵌入到HTML中
  • PHP(全稱:PHP:Hypertext Preprocessor,即"PHP:超文字前處理器")是一種通用開源指令碼語言。
  • PHP 指令碼在伺服器上執行。
  • PHP 可免費下載使用。
  • PHP 是一門弱型別語言

PHP檔案

  • PHP 檔案可包含文字、HTML、JavaScript程式碼和 PHP 程式碼
  • PHP 程式碼在伺服器上執行,結果以純 HTML 形式返回給瀏覽器
  • PHP 檔案的預設副檔名是 ".php"

PHP可以做什麼

  • PHP 可以生成動態頁面內容
  • PHP 可以建立、開啟、讀取、寫入、關閉伺服器上的檔案
  • PHP 可以收集表單資料
  • PHP 可以傳送和接收 cookies
  • PHP 可以新增、刪除、修改您的資料庫中的資料
  • PHP 可以限制使用者訪問您的網站上的一些頁面
  • PHP 可以加密資料

PHP程式碼標記

  • ASP標記(基本棄用):<% php程式碼 %>
  • 短標記(基本棄用):<? php程式碼 ?>
  • 指令碼標記:<script language='php'> php程式碼 </script>
  • 標準標記(常用):<?php php程式碼 ?>

基礎語法

個人感覺程式語言總的來說都有一定的相似性,有過一門或者幾門程式語言的學習基礎的話,再接觸學習新語言就會快很多(這裡只是粗略整理PHP的相關知識)

規則

  • PHP 中的每個程式碼行都必須以分號結束。分號是一種分隔符,用於把指令集區分開來。
  • 可以省略末尾的?> ,讓其自動判斷php程式碼的結束(避免產生較多空行)

註釋

  • 單行註釋使用 // ···
  • 多行註釋使用 /* ··· */

變數

  • 變數是用於儲存資訊的"容器"
  • 示例:$x=5; $z=$x+$y; echo $z;
  • 與代數類似,可以給 PHP 變數賦予某個值(x=5)或者表示式(z=x+y)。
  • 變數可以是很短的名稱(如 x 和 y)或者更具描述性的名稱(如 age、carname、totalvolume)。
  • PHP 變數規則:
    • 變數以 $ 符號開始,後面跟著變數的名稱
    • 變數名必須以字母或者下劃線字元開始
    • 變數名只能包含字母數字字元以及下劃線(A-z、0-9 和 _ )
    • 變數名不能包含空格
    • 變數名是區分大小寫的($y 和 $Y 是兩個不同的變數)
  • 刪除變數:unset()
  • 變數作用域
    • local
    • global
    • static
    • parameter

Tip:在所有函式外部定義的變數,擁有全域性作用域。除了函式外,全域性變數可以被指令碼中的任何部分訪問,要在一個函式中訪問一個全域性變數,需要使用 global 關鍵字。

Tip:在 PHP 函式內部宣告的變數是區域性變數,僅能在函式內部訪問

Tip:PHP 將所有全域性變數儲存在一個名為 $GLOBALS[index] 的陣列中。 index 儲存變數的名稱。這個陣列可以在函式內部訪問,也可以直接用來更新全域性變數。

Tip:當一個函式完成時,它的所有變數通常都會被刪除。若需要保留某區域性變數使用static 關鍵字

Tip:$a = 'b'; $b = 'bb'; $$a = 'bb'

Tip:引數是通過呼叫程式碼將值傳遞給函式的區域性變數。引數是在引數列表中宣告的,作為函式宣告的一部分

  • 預定義變數
    • $_GET 獲取所有表單以get方式提交的資料
    • $_POST post方式提交的資料
    • $_REQUEST get和post方式提交的資料
    • $_GLOBALS 所有全域性變數
    • $_SERVER 伺服器資訊
    • $_SESSION session會話資料
    • $_COOKIE cookie會話資料
    • $_ENV 環境資訊
    • $_FILES 使用者上傳檔案資訊

變數傳值

  • 瞭解記憶體

    • 棧區:程式可以操作的記憶體部分(不存資料,執行程式程式碼),少但是快
    • 程式碼區:儲存程式的記憶體部分(不執行)
    • 資料段:儲存普通資料(全域性區和靜態區)
    • 堆區:儲存複雜資料,大但是效率低
  • 值傳遞

    • 將變數儲存的值複製一份,然後將新的值傳遞給另外一個變數儲存(兩個變數相互獨立沒有關係)
    • 示例:$a = 1; $b = $a
      1. 程式碼裝載:從指令碼檔案中將程式碼讀取出來進行編譯,將編譯的結果放置在程式碼段(位元組碼)
      2. 程式碼執行:從程式碼段中按照一定的順序執行程式碼,執行$a = 1 在棧區開闢一塊記憶體儲存$a ,在資料段中開闢一塊記憶體儲存值1 然後將其所在的記憶體位置賦給a 變數;執行$b = $a 在棧區開闢一塊記憶體儲存$b ,取出 $a 的值將其儲存在資料段,將所在值的記憶體地址賦給$b
      3. 指令碼執行結束,系統會回收所佔有的記憶體(棧區、程式碼段)
  • 引用傳遞

    • 將變數儲存值的記憶體地址傳遞給另一個變數(兩個變數指向的是同一個值的記憶體地址)
    • 示例:$a = 1; $b = &$a
      1. 程式碼裝載:從指令碼檔案中將程式碼讀取出來進行編譯,將編譯的結果放置在程式碼段(位元組碼)
      2. 程式碼執行:從程式碼段中按照一定的順序執行程式碼,執行$a = 1 在棧區開闢一塊記憶體儲存$a ,在資料段中開闢一塊記憶體儲存值1 然後將其所在的記憶體位置賦給a 變數;執行$b = &$a ,將 $a 對應的值的記憶體地址賦給$b
      3. 指令碼執行結束,系統會回收所佔有的記憶體(棧區、程式碼段)

常量

  • 常量值被定義後,在指令碼的其他任何地方都不能被改變。
  • 常量是一個簡單值的識別符號。該值在指令碼中不能改變。
  • 一個常量由英文字母、下劃線、和數字組成,但數字不能作為首字母出現。 (常量名不需要加 $ 修飾符)。

Tip: 常量在整個指令碼中都可以使用,預設為全域性變數。

  • 設定常量,使用 define() 函式,語法:define ( string $name , mixed $value [, bool $case_insensitive = false ] )

    • 該函式有三個引數:
      • name:必選引數,常量名稱,即標誌符。
      • value:必選引數,常量的值。
      • case_insensitive :可選引數,如果設定為 TRUE,該常量則大小寫不敏感。預設是大小寫敏感的。
    • 示例:define('PI', 3.14); 或者 const PII = 3;
  • 系統常量:簡要了解這裡不再贅述

  • 幾個魔術常量:

    • __ DIR__:當前被執行指令碼所在絕對路徑

    • __ FILE__:當前被執行指令碼所在絕對路徑+當前檔名

    • __ LINK__:當前所屬行數

    • __ NAMESPACE__:當前所屬名稱空間

    • __ CLASS__:當前所屬類

    • __ METHOD__:當前所屬方法

資料型別

  • 基本資料型別
    • 整型:int/integer,系統分配四個位元組儲存,標識整數型別(有前提)
      • 整數必須至少有一個數字 (0-9)
      • 整數不能包含逗號或空格
      • 整數是沒有小數點的
      • 整數可以是正數或負數
      • 整型可以用四種格式來指定:十進位制, 十六進位制( 字首0x )、八進位制(字首為 0)、二進位制(字首0b)。
    • 浮點型:float/double,系統分配八個位元組儲存,表示小數或者整型存不下的整數(不能儲存精確數值)
      • 浮點數是帶小數部分的數字,或是指數形式
    • 字串:string,系統根據實際長度分配,表示字串(引號包裹)
    • 布林值:bool/Boolean,true或者false

Tip:預設PHP輸出數值都會轉換為十進位制輸出,但是提供了進位制轉換的一些函式

  • 複合資料型別
    • 物件型別:object,存放物件
    • 陣列型別:array,存放多個數據
  • 特殊資料型別
    • 資源型別:resource,存放資源資料(PHP外部資料)
    • 空型別:NULL(不能運算)
      • 可以通過設定變數值為 NULL 來清空變數資料

型別轉換

  • 自動轉換:系統根據自身的需求自己判定,自動轉換
  • 強制轉換:根據自己所需的型別將目標資料轉換
  • 函式比較
表示式 gettype() empty() is_null() isset() boolean : if($x)
$x = ""; string TRUE FALSE TRUE FALSE
$x = null; NULL TRUE TRUE FALSE FALSE
var $x; NULL TRUE TRUE FALSE FALSE
$x is undefined NULL TRUE TRUE FALSE FALSE
$x = array(); array TRUE FALSE TRUE FALSE
$x = false; boolean TRUE FALSE TRUE FALSE
$x = true; boolean FALSE FALSE TRUE TRUE
$x = 1; integer FALSE FALSE TRUE TRUE
$x = 42; integer FALSE FALSE TRUE TRUE
$x = 0; integer TRUE FALSE TRUE FALSE
$x = -1; integer FALSE FALSE TRUE TRUE
$x = "1"; string FALSE FALSE TRUE TRUE
$x = "0"; string TRUE FALSE TRUE FALSE
$x = "-1"; string FALSE FALSE TRUE TRUE
$x = "php"; string FALSE FALSE TRUE TRUE
$x = "true"; string FALSE FALSE TRUE TRUE
$x = "false"; string FALSE FALSE TRUE TRUE
  • 鬆散比較==
TRUE FALSE 1 0 -1 "1" "0" "-1" NULL array() "php" ""
TRUE TRUE FALSE TRUE FALSE TRUE TRUE FALSE TRUE FALSE FALSE TRUE FALSE
FALSE FALSE TRUE FALSE TRUE FALSE FALSE TRUE FALSE TRUE TRUE FALSE TRUE
1 TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
0 FALSE TRUE FALSE TRUE FALSE FALSE TRUE FALSE TRUE FALSE TRUE TRUE
-1 TRUE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
"1" TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
"0" FALSE TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
"-1" TRUE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
NULL FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE TRUE TRUE FALSE TRUE
array() FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE
"php" TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
"" FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE
  • 嚴格比較===
TRUE FALSE 1 0 -1 "1" "0" "-1" NULL array() "php" ""
TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
1 FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
0 FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
-1 FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
"1" FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
"0" FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
"-1" FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
NULL FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
array() FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
"php" FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
"" FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
  • 強制型別轉換:(資料型別)需要轉換的資料或者變數,示例:$a = '1.1.1abc'; echo (float)$a
    • 轉換為NULL使用(unset)$a
  • is_type() :返回一個布林值,用於檢視指定資料是否為某型別的資料(bool型別不能使用echo 檢視,需要使用var_dump
  • gettype(變數名) :獲取型別,得到的是該型別對應的字串
  • settype(變數名,型別) :設定變數的型別
  • empty():判斷資料是否為空(並非NULL),為空返回true,否則返回false
  • isset():判斷資料儲存的變數本身是否存在,存在返回true,否則返回false

運算子

  • 算術運算子

    運算子 名稱 描述 例項 結果
    x + y x 和 y 的和 2 + 2 4
    x - y x 和 y 的差 5 - 2 3
    x * y x 和 y 的積 5 * 2 10
    x / y x 和 y 的商 15 / 5 3
    x % y 模(除法的餘數) x 除以 y 的餘數 5 % 2 10 % 8 10 % 2 1 2 0
    - x 取反 x 取反 <?php $x =2; echo -$x; ?> -2
    a . b 並置 連線兩個字串 "Hi" . "Ha" HiHa
    • PHP7+ 版本新增整除運算子 intdiv()
  • 賦值運算子

    運算子 等同於 描述
    x = y x = y 左運算元被設定為右側表示式的值
    x += y x = x + y
    x -= y x = x - y
    x *= y x = x * y
    x /= y x = x / y
    x %= y x = x % y 模(除法的餘數)
    a .= b a = a . b 連線兩個字串
  • 遞增遞減運算子

    運算子 名稱 描述
    ++ x 預遞增 x 加 1,然後返回 x
    x ++ 後遞增 返回 x,然後 x 加 1
    -- x 預遞減 x 減 1,然後返回 x
    x -- 後遞減 返回 x,然後 x 減 1
    • 使用時注意! $a = 1; $b = $a++; // $b = 1$c = ++$a; // $c = 3
  • 比較運算子

    運算子 名稱 描述 例項
    x == y 等於 如果 x 等於 y,則返回 true 5==8 返回 false
    x === y 絕對等於 如果 x 等於 y,且它們型別相同,則返回 true 5==="5" 返回 false
    x != y 不等於 如果 x 不等於 y,則返回 true 5!=8 返回 true
    x <> y 不等於 如果 x 不等於 y,則返回 true 5<>8 返回 true
    x !== y 絕對不等於 如果 x 不等於 y,或它們型別不相同,則返回 true 5!=="5" 返回 true
    x > y 大於 如果 x 大於 y,則返回 true 5>8 返回 false
    x < y 小於 如果 x 小於 y,則返回 true 5<8 返回 true
    x >= y 大於等於 如果 x 大於或者等於 y,則返回 true 5>=8 返回 false
    x <= y 小於等於 如果 x 小於或者等於 y,則返回 true 5<=8 返回 true
  • 邏輯運算子

    運算子 名稱 描述 例項
    x and y 如果 x 和 y 都為 true,則返回 true x=6 y=3 (x < 10 and y > 1) 返回 true
    x or y 如果 x 和 y 至少有一個為 true,則返回 true x=6 y=3 (x6 or y5) 返回 true
    x xor y 異或 如果 x 和 y 有且僅有一個為 true,則返回 true x=6 y=3 (x6 xor y3) 返回 false
    x && y 如果 x 和 y 都為 true,則返回 true x=6 y=3 (x < 10 && y > 1) 返回 true
    x || y 如果 x 和 y 至少有一個為 true,則返回 true x=6 y=3 (x5 || y5) 返回 false
    ! x 如果 x 不為 true,則返回 true x=6 y=3 !(x==y) 返回 true
  • 陣列運算子

    運算子 名稱 描述
    x + y 集合 x 和 y 的集合
    x == y 相等 如果 x 和 y 具有相同的鍵/值對,則返回 true
    x === y 恆等 如果 x 和 y 具有相同的鍵/值對,且順序相同型別相同,則返回 true
    x != y 不相等 如果 x 不等於 y,則返回 true
    x <> y 不相等 如果 x 不等於 y,則返回 true
    x !== y 不恆等 如果 x 不等於 y,則返回 true
  • 位運算子

    例子 名稱 結果
    $a & $b And(按位與) 將把 $a 和 $b 中都為 1 的位設為 1。
    $a | $b Or(按位或) 將把 $a 和 $b 中任何一個為 1 的位設為 1。
    $a ^ $b Xor(按位異或) 將把 $a 和 $b 中一個為 1 另一個為 0 的位設為 1。
    ~ $a Not(按位取反) 將 $a 中為 0 的位設為 1,反之亦然。
    $a << $b Shift left(左移) 將 a 中的位向左移動 ​b 次(每一次移動都表示“乘以 2”)。
    $a >> $b Shift right(右移) 將 a 中的位向右移動 b 次(每一次移動都表示“除以 2”)。
  • 三元運算子(expr1) ? (expr2) : (expr3)

    • 對 expr1 求值為 TRUE 時的值為 expr2,在 expr1 求值為 FALSE 時的值為 expr3。
    • 自 PHP 5.3 起,可以省略三元運算子中間那部分。表示式 expr1 ?: expr3 在 expr1 求值為 TRUE 時返回 expr1,否則返回 expr3。
    • ($b) ? $c = 1 : $c = 0; 等價於 $c = ($b) ? 1 : 0;

Tip:PHP_EOL 是一個換行符,相容更大平臺。

  • 組合比較符

    • PHP7+ 支援組合比較符(combined comparison operator)也稱之為太空船操作符,符號為 <=>。組合比較運算子可以輕鬆實現兩個變數的比較,當然不僅限於數值類資料的比較。
    • 語法格式:$c = $a <=> $b;
      • 如果 $a > $b, 則 $c 的值為 1
      • 如果 $a == $b, 則 $c 的值為 0
      • 如果 $a < $b, 則 $c 的值為 -1
  • 運算子優先順序

    • 下表按照優先順序從高到低列出了運算子。同一行中的運算子具有相同優先順序,此時它們的結合方向決定求值順序。
    結合方向 運算子 附加資訊
    clone new clone 和 new
    [ array()
    ++ -- ~ (int) (float) (string) (array) (object) (bool) @ 型別和遞增/遞減
    instanceof 型別
    ! 邏輯運算子
    * / % 算術運算子
    + – . 算術運算子和字串運算子
    << >> 位運算子
    == != === !== <> 比較運算子
    & 位運算子和引用
    ^ 位運算子
    | 位運算子
    && 邏輯運算子
    || 邏輯運算子
    ? : 三元運算子
    = += -= *= /= .= %= &= |= ^= <<= >>= => 賦值運算子
    and 邏輯運算子
    xor 邏輯運算子
    or 邏輯運算子
    , 多處用到

Tip:我們通過括號的配對來明確標明運算順序,而非靠運算子優先順序和結合性來決定,通常能夠增加程式碼的可讀性。

Tip:錯誤抑制符@ :在可能發生錯誤的程式碼前使用該符號並將其使用括號包裹

If···Else語句

  • 條件語句用於根據不同條件執行不同動作。

  • if 語句 - 在條件成立時執行程式碼

  • if...else 語句 - 在條件成立時執行一塊程式碼,條件不成立時執行另一塊程式碼

  • if...elseif....else 語句 - 在若干條件之一成立時執行一個程式碼塊

  • if 語句用於僅當指定條件成立時執行程式碼

    • 語法示例:

      if (條件)
      {
          條件成立時要執行的程式碼;
      }
      
  • 在條件成立時執行一塊程式碼,條件不成立時執行另一塊程式碼,請使用 if....else 語句。

    • 語法示例:

      if (條件)
      {
      條件成立時執行的程式碼;
      }
      else
      {
      條件不成立時執行的程式碼;
      }
      
  • 在若干條件之一成立時執行一個程式碼塊,請使用 if....elseif...else 語句。

    • 示例語法:

      if (條件)
      {
          if 條件成立時執行的程式碼;
      }
      elseif (條件)
      {
          elseif 條件成立時執行的程式碼;
      }
      else
      {
          條件不成立時執行的程式碼;
      }
      

Switch語句

  • switch 語句用於根據多個不同條件執行不同動作。

  • 希望有選擇地執行若干程式碼塊之一,請使用 switch 語句。

    • 語法示例:

      switch (n)
      {
      case label1:
          如果 n=label1,此處程式碼將執行;
          break;
      case label2:
          如果 n=label2,此處程式碼將執行;
          break;
      default:
          如果 n 既不等於 label1 也不等於 label2,此處程式碼將執行;
      }
      
    • 工作原理:首先對一個簡單的表示式 n(通常是變數)進行一次計算。將表示式的值與結構中每個 case 的值進行比較。如果存在匹配,則執行與 case 關聯的程式碼。程式碼執行後,使用 break 來阻止程式碼跳入下一個 case 中繼續執行。default 語句用於不存在匹配(即沒有 case 為真)時執行。

For迴圈

  • 迴圈執行程式碼塊指定的次數,或者當指定的條件為真時迴圈執行程式碼塊。

  • 語法示例:

    for (初始值; 條件; 增量)
    {
        要執行的程式碼;
    }
    
    • 引數:
      • 初始值:主要是初始化一個變數值,用於設定一個計數器(但可以是任何在迴圈的開始被執行一次的程式碼)。
      • 條件:迴圈執行的限制條件。如果為 TRUE,則迴圈繼續。如果為 FALSE,則迴圈結束。
      • 增量:主要用於遞增計數器(但可以是任何在迴圈的結束被執行的程式碼)。

While迴圈

  • while 迴圈將重複執行程式碼塊,直到指定的條件不成立。

  • 語法示例:

    while (條件)
    {
        要執行的程式碼;
    }
    
  • do...while 語句會至少執行一次程式碼,然後檢查條件,只要條件成立,就會重複進行迴圈。

  • 語法示例:

    do
    {
        要執行的程式碼;
    }
    while (條件);
    

Tip:continue在迴圈結構中使用會跳過再次之後的程式碼進行新一輪迴圈

Tip:break在迴圈結構中使用會結束迴圈

在HTML中的巢狀寫法

  • 示例程式碼,九九乘法表

        <table>
            <?php for($i=1; $i<10; $i++){ ?>
                <tr>
                    <?php for($j=1; $j<=$i; $j++){ ?>
                        <td class="addBorder">
                            <?php echo $i.'*'.$j.'='.$i*$j; ?>
                        </td>
                    <?php }?>
                </tr>
            <?php }?>
        </table>
    

Echo和Print

  • 在 PHP 中有兩個基本的輸出方式: echo 和 print。

  • echo 和 print 區別:

    • echo - 可以輸出一個或多個字串
    • print - 只允許輸出一個字串,返回值總為 1
  • echo 是一個語言結構,使用的時候可以不用加括號,也可以加上括號: echo 或 echo()。

Tip:echo 輸出的速度比 print 快, echo 沒有返回值,print有返回值1。

  • print 同樣是一個語言結構,可以使用括號,也可以不使用括號: print 或 print()。

Tip:在print輸出的字串中同時輸出變數,該變數需要使用{}包裹

時間相關函式

  • date() :可把時間戳格式化為可讀性更好的日期和時間。

  • 語法:string date ( string $format [, int $timestamp ] )

    • date() 函式的第一個必需引數 format 規定了如何格式化日期/時間。
      • d - 代表月中的天 (01 - 31)
      • m - 代表月 (01 - 12)
      • Y - 代表年 (四位數)
  • 示例:date("Y/m/d")

  • 參考

    format 字元 說明 返回值例子
    --- ---
    d 月份中的第幾天,有前導零的 2 位數字 0131
    D 星期中的第幾天,文字表示,3 個字母 MonSun
    j 月份中的第幾天,沒有前導零 131
    l("L"的小寫字母) 星期幾,完整的文字格式 SundaySaturday
    N ISO-8601 格式數字表示的星期中的第幾天(PHP 5.1.0 新加) 1(表示星期一)到 7(表示星期天)
    S 每月天數後面的英文字尾,2 個字元 stndrd 或者 th。可以和 j 一起用
    w 星期中的第幾天,數字表示 0(表示星期天)到 6(表示星期六)
    z 年份中的第幾天 0365
    星期 --- ---
    W ISO-8601 格式年份中的第幾周,每週從星期一開始(PHP 4.1.0 新加的) 例如:42(當年的第 42 周)
    --- ---
    F 月份,完整的文字格式,例如 January 或者 March JanuaryDecember
    m 數字表示的月份,有前導零 0112
    M 三個字母縮寫表示的月份 JanDec
    n 數字表示的月份,沒有前導零 112
    t 給定月份所應有的天數 2831
    --- ---
    L 是否為閏年 如果是閏年為 1,否則為 0
    o ISO-8601 格式年份數字。這和 Y 的值相同,只除了如果 ISO 的星期數(W)屬於前一年或下一年,則用那一年。(PHP 5.1.0 新加) Examples: 1999 or 2003
    Y 4 位數字完整表示的年份 例如:19992003
    y 2 位數字表示的年份 例如:9903
    時間 --- ---
    a 小寫的上午和下午值 ampm
    A 大寫的上午和下午值 AMPM
    B Swatch Internet 標準時 000999
    g 小時,12 小時格式,沒有前導零 112
    G 小時,24 小時格式,沒有前導零 023
    h 小時,12 小時格式,有前導零 0112
    H 小時,24 小時格式,有前導零 0023
    i 有前導零的分鐘數 0059>
    s 秒數,有前導零 0059>
    u 毫秒 (PHP 5.2.2 新加)。需要注意的是 date() 函式總是返回 000000 因為它只接受 integer 引數, 而 DateTime::format() 才支援毫秒。 示例: 654321
    時區 --- ---
    e 時區標識(PHP 5.1.0 新加) 例如:UTCGMTAtlantic/Azores
    I 是否為夏令時 如果是夏令時為 1,否則為 0
    O 與格林威治時間相差的小時數 例如:+0200
    P 與格林威治時間(GMT)的差別,小時和分鐘之間有冒號分隔(PHP 5.1.3 新加) 例如:+02:00
    T 本機所在的時區 例如:ESTMDT(【譯者注】在 Windows 下為完整文字格式,例如"Eastern Standard Time",中文版會顯示"中國標準時間")。
    Z 時差偏移量的秒數。UTC 西邊的時區偏移量總是負的,UTC 東邊的時區偏移量總是正的。 -4320043200
    完整的日期/時間 --- ---
    c ISO 8601 格式的日期(PHP 5 新加) 2004-02-12T15:19:21+00:00
    r RFC 822 格式的日期 例如:Thu, 21 Dec 2000 16:01:07 +0200
    U 從 Unix 紀元(January 1 1970 00:00:00 GMT)開始至今的秒數 參見 time()
  • time() :返回自 Unix 紀元(January 1 1970 00:00:00 GMT)起的當前時間的秒數

  • microtime() :獲取微秒級別的時間

陣列

  • 陣列是一個能在單個變數中儲存多個值的特殊變數。

  • array() 函式用於建立陣列

  • 在 PHP 中,有三種類型的陣列:

    • 數值陣列 - 帶有數字 ID 鍵的陣列
    • 關聯陣列 - 帶有指定的鍵的陣列,每個鍵關聯一個值
    • 多維陣列 - 包含一個或多個數組的陣列
  • 數值陣列

    • 示例:$a = array('Tom', 'Jack', 'Alice'); echo $a[0], $a[1], $a[2];
    • 示例2:$a[] = 1
    • 獲取陣列長度 count()
  • 關聯陣列

    • 關聯陣列是使用您分配給陣列的指定的鍵的陣列。

    • 示例:$a = array('name'=>'Tom', 'age'=>12, 'id'=>001); $a['mark'] = true; echo $a['name'];

    • 遍歷關聯陣列

              foreach($a as $x=>$x_value)
              {
                  echo $x.'對應值為:'.$x_value;
                  echo '<br />';
              }
      
  • 常用函式

    • list() 函式用於在一次操作中給一組變數賦值。(只用於數字索引的陣列。)

      • 語法:list(*var1,var2...*)
      引數 描述
      var1 必需。第一個需要賦值的變數。
      var2,... 可選。更多需要賦值的變數。
    • reset() 函式將內部指標指向陣列中的第一個元素,並輸出。

      • 相關的方法:
        • current() - 返回陣列中的當前元素的值。
        • end() - 將內部指標指向陣列中的最後一個元素,並輸出。
        • next() - 將內部指標指向陣列中的下一個元素,並輸出。
        • prev() - 將內部指標指向陣列中的上一個元素,並輸出。
      • 語法:reset(*array*)
    • count() 函式返回陣列中元素的數目。

      • 語法:count(*array,mode*);
      引數 描述
      array 必需。規定要計數的陣列。
      mode 可選。規定函式的模式。可能的值:0 - 預設。不計算多維陣列中的所有元素。1 - 遞迴地計算陣列中元素的數目(計算多維陣列中的所有元素)。
    • array_push() 函式向陣列尾部插入一個或多個元素。

      • 語法:array_push(*array,value1,value2...*)
      引數 描述
      array 必需。規定一個數組。
      value1 必需。規定要新增的值。
      value2 可選。規定要新增的值。
    • array_pop() 函式刪除陣列中的最後一個元素。

      • 語法:array_pop(*array*)
    • array_shift() 函式用於刪除陣列中的第一個元素,並返回被刪除的元素。

    • array_unshift()函式用於向陣列插入新元素。新陣列的值將被插入到陣列的開頭。

      • 語法:array_unshift(*array,value1,value2,value3...*)
      引數 描述
      array 必需。規定陣列。
      value1 必需。規定插入的值。
      value2 可選。規定插入的值。
      value3 可選。規定插入的值。
    • array_unique() 函式用於移除陣列中重複的值。如果兩個或更多個數組值相同,只保留第一個值,其他的值被移除。

      • 語法:array_unique(*array*)
      引數 描述
      array 必需。規定陣列。
      sortingtype 可選。規定排序型別。可能的值:SORT_STRING - 預設。把每一項作為字串來處理。SORT_REGULAR - 把每一項按常規順序排列(Standard ASCII,不改變型別)。SORT_NUMERIC - 把每一項作為數字來處理。SORT_LOCALE_STRING - 把每一項作為字串來處理,基於當前區域設定(可通過 setlocale() 進行更改)。
    • in_array() 函式搜尋陣列中是否存在指定的值。

      • 語法:bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
      引數 描述
      needle 必需。規定要在陣列搜尋的值。
      haystack 必需。規定要搜尋的陣列。
      strict 可選。如果該引數設定為 TRUE,則 in_array() 函式檢查搜尋的資料與陣列的值的型別是否相同。
    • array_keys() 函式返回包含陣列中所有鍵名的一個新陣列。

      • 語法:array_keys(*array,value,strict*)
      引數 描述
      array 必需。規定陣列。
      value 可選。您可以指定鍵值,然後只有該鍵值對應的鍵名會被返回。
      strict 可選。與 value 引數一起使用。可能的值:true - 返回帶有指定鍵值的鍵名。依賴型別,數字 5 與字串 "5" 是不同的。false - 預設值。不依賴型別,數字 5 與字串 "5" 是相同的。
    • array_values() 函式返回包含陣列中所有的值的陣列。

  • 陣列排序函式總結:

    • sort() - 對陣列進行升序排列
    • rsort() - 對陣列進行降序排列
    • asort() - 根據關聯陣列的值,對陣列進行升序排列
    • ksort() - 根據關聯陣列的鍵,對陣列進行升序排列
    • arsort() - 根據關聯陣列的值,對陣列進行降序排列
    • krsort() - 根據關聯陣列的鍵,對陣列進行降序排列
  • 參考

    函式 描述
    array() 建立陣列。
    array_change_key_case() 返回其鍵均為大寫或小寫的陣列。
    array_chunk() 把一個數組分割為新的陣列塊。
    array_column() 返回輸入陣列中某個單一列的值。
    array_combine() 通過合併兩個陣列(一個為鍵名陣列,一個為鍵值陣列)來建立一個新陣列。
    array_count_values() 用於統計陣列中所有值出現的次數。
    array_diff() 比較陣列,返回兩個陣列的差集(只比較鍵值)。
    array_diff_assoc() 比較陣列,返回兩個陣列的差集(比較鍵名和鍵值)。
    array_diff_key() 比較陣列,返回兩個陣列的差集(只比較鍵名)。
    array_diff_uassoc() 比較陣列,返回兩個陣列的差集(比較鍵名和鍵值,使用使用者自定義的鍵名比較函式)。
    array_diff_ukey() 比較陣列,返回兩個陣列的差集(只比較鍵名,使用使用者自定義的鍵名比較函式)。
    array_fill() 用給定的鍵值填充陣列。
    array_fill_keys() 用給定的指定鍵名的鍵值填充陣列。
    array_filter() 用回撥函式過濾陣列中的元素。
    array_flip() 反轉/交換陣列中的鍵名和對應關聯的鍵值。
    array_intersect() 比較陣列,返回兩個陣列的交集(只比較鍵值)。
    array_intersect_assoc() 比較陣列,返回兩個陣列的交集(比較鍵名和鍵值)。
    array_intersect_key() 比較陣列,返回兩個陣列的交集(只比較鍵名)。
    array_intersect_uassoc() 比較陣列,返回兩個陣列的交集(比較鍵名和鍵值,使用使用者自定義的鍵名比較函式)。
    array_intersect_ukey() 比較陣列,返回兩個陣列的交集(只比較鍵名,使用使用者自定義的鍵名比較函式)。
    array_key_exists() 檢查指定的鍵名是否存在於陣列中。
    array_keys() 返回陣列中所有的鍵名。
    array_map() 將使用者自定義函式作用到給定陣列的每個值上,返回新的值。
    array_merge() 把一個或多個數組合併為一個數組。
    array_merge_recursive() 遞迴地把一個或多個數組合併為一個數組。
    array_multisort() 對多個數組或多維陣列進行排序。
    array_pad() 將指定數量的帶有指定值的元素插入到陣列中。
    array_pop() 刪除陣列中的最後一個元素(出棧)。
    array_product() 計算陣列中所有值的乘積。
    array_push() 將一個或多個元素插入陣列的末尾(入棧)。
    array_rand() 從陣列中隨機選出一個或多個元素,返回鍵名。
    array_reduce() 通過使用使用者自定義函式,迭代地將陣列簡化為一個字串,並返回。
    array_replace() 使用後面陣列的值替換第一個陣列的值。
    array_replace_recursive() 遞迴地使用後面陣列的值替換第一個陣列的值。
    array_reverse() 將原陣列中的元素順序翻轉,建立新的陣列並返回。
    array_search() 在陣列中搜索給定的值,如果成功則返回相應的鍵名。
    array_shift() 刪除陣列中的第一個元素,並返回被刪除元素的值。
    array_slice() 返回陣列中的選定部分。
    array_splice() 把陣列中的指定元素去掉並用其它值取代。
    array_sum() 返回陣列中所有值的和。
    array_udiff() 比較陣列,返回兩個陣列的差集(只比較鍵值,使用一個使用者自定義的鍵名比較函式)。
    array_udiff_assoc() 比較陣列,返回兩個陣列的差集(比較鍵名和鍵值,使用內建函式比較鍵名,使用使用者自定義函式比較鍵值)。
    array_udiff_uassoc() 比較陣列,返回兩個陣列的差集(比較鍵名和鍵值,使用兩個使用者自定義的鍵名比較函式)。
    array_uintersect() 比較陣列,返回兩個陣列的交集(只比較鍵值,使用一個使用者自定義的鍵名比較函式)。
    array_uintersect_assoc() 比較陣列,返回兩個陣列的交集(比較鍵名和鍵值,使用內建函式比較鍵名,使用使用者自定義函式比較鍵值)。
    array_uintersect_uassoc() 比較陣列,返回兩個陣列的交集(比較鍵名和鍵值,使用兩個使用者自定義的鍵名比較函式)。
    array_unique() 刪除陣列中重複的值。
    array_unshift() 在陣列開頭插入一個或多個元素。
    array_values() 返回陣列中所有的值。
    array_walk() 對陣列中的每個成員應用使用者函式。
    array_walk_recursive() 對陣列中的每個成員遞迴地應用使用者函式。
    arsort() 對關聯陣列按照鍵值進行降序排序。
    asort() 對關聯陣列按照鍵值進行升序排序。
    compact() 建立一個包含變數名和它們的值的陣列。
    count() 返回陣列中元素的數目。
    current() 返回陣列中的當前元素。
    each() 返回陣列中當前的鍵/值對。
    end() 將陣列的內部指標指向最後一個元素。
    extract() 從陣列中將變數匯入到當前的符號表。
    in_array() 檢查陣列中是否存在指定的值。
    key() 從關聯陣列中取得鍵名。
    krsort() 對關聯陣列按照鍵名降序排序。
    ksort() 對關聯陣列按照鍵名升序排序。
    list() 把陣列中的值賦給一些陣列變數。
    natcasesort() 用"自然排序"演算法對陣列進行不區分大小寫字母的排序。
    natsort() 用"自然排序"演算法對陣列排序。
    next() 將陣列中的內部指標向後移動一位。
    pos() current() 的別名。
    prev() 將陣列的內部指標倒回一位。
    range() 建立一個包含指定範圍的元素的陣列。
    reset() 將陣列的內部指標指向第一個元素。
    rsort() 對數值陣列進行降序排序。
    shuffle() 把陣列中的元素按隨機順序重新排列。
    sizeof() count() 的別名。
    sort() 對數值陣列進行升序排序。
    uasort() 使用使用者自定義的比較函式對陣列中的鍵值進行排序。
    uksort() 使用使用者自定義的比較函式對陣列中的鍵名進行排序。
    usort() 使用使用者自定義的比較函式對陣列進行排序。

函式

  • 建立函式

    function functionName($a, $b, ···)
    {
        // 要執行的程式碼
    }
    
    • PHP 函式準則:
      • 函式的名稱應該提示出它的功能
      • 函式名稱以字母或下劃線開頭(不能以數字開頭)
      • 引數就在函式名稱後面的一個括號內指定。
      • 可以通過return關鍵字讓函式返回一個值
      • 可以在指定形參的時候為其賦一個初始值(指定初始值的引數需放在最後)

Tip:若在形參前加上& 意為將傳入實參的記憶體地址賦值給該形參(注意!此時形參對應的是真實的實引數據,且只有變數能夠被引用傳值)

  • 可變函式:當一個變數所儲存的值剛好是一個函式的名字,那麼就可以使用該變數名() 的方式來呼叫對應的函式

  • 示例

            $a = 'fun1';
    
            function fun1()
            {
                echo __FUNCTION__;
            }
    
            fun1();
            $a();
    

Tip:將一個函式(函式名)作為引數傳遞給另一個函式區呼叫稱之為回撥過程,該函式被稱之為回撥函式

  • 匿名函式$a = function(){···}; ,呼叫方法同可變函式

  • 閉包closure:要執行的程式碼塊(由於自由變數被包含在程式碼塊中,這些自由變數以及他們引用的物件沒有被釋放)和為自由變數提供繫結的計算環境(作用域)

    • 簡單理解:函式內部有一些區域性變數(要執行的程式碼塊)在函式執行完畢後沒有被釋放,是因為在函式內部還有對應的函式在引用(匿名函式)

    • 示例:

      // use將外部的變數(區域性)保留給內部使用。注意!貌似不同於python和JavaScript
      
              function fun1()
              {
                  $a = 1;
      
                  $b = function() use($a)
                  {
                      echo $a;
                  };
      
                  return $b;
              }
      
              $closureVar = fun1();
              $closureVar();
      

錯誤

  • 錯誤分類
    • 語法錯誤:書寫的程式碼不符合PHP規範,編譯不通過,程式碼不會執行(Paesr error)
    • 執行時錯誤:程式碼編譯通過,但是在執行的時候會出現一些條件不滿足導致的錯誤(Runtime error)
    • 邏輯錯誤:程式碼不規範,出現一些邏輯性的錯誤,程式碼正常執行,但是得到的是錯誤的結果
  • 錯誤代號
    • E_PARSE:編譯錯誤,程式碼不會執行
    • E_ERROR:fatal error,致命錯誤,會導致程式碼不能正確繼續執行(會在出錯誤的位置停止)
    • E_WARNING:警告,不會影響程式碼的執行,但是可能得不到正確的結果
    • E_NOTICE:提示通知,不會影響程式碼的執行
  • 主動觸發錯誤
    • trigger_error(提示資訊)

字串

  • 可以使用單引號或者雙引號來定義一個字串

    • 雙引號中可以使用$ 字首來輸出變數(變數字元末尾需要新增空格與內容區分),或者使用{}包裹
  • 結構化定義(保留當前字串的格式)

            $a = <<<EOD // heredoc結構,上邊界符後必須沒有任何內容,下邊界符必須頂格
            hello
    EOD;
    
            $b = <<<'EOD' // nowdoc結構
            PHP
    EOD;
    
  • 字串轉義

    • \'
    • \''
    • \r 回車(回到行首)
    • \n 新一行
    • \t 類似tab,輸出4個空格
    • \$ 特定識別變數符號

Tip:在單雙引號中所能識別的轉義字元不同

  • 獲取字串長度strlen(),按照標準字符集統計(若需要指定特殊的字符集統需要使用mbstring模組)

  • 相關常用函式

    • implode() 函式返回一個由陣列元素組合成的字串。

      • 語法:implode(*separator,array)
      引數 描述
      separator 可選(但是推薦使用)。規定陣列元素之間放置的內容。預設是 ""(空字串)。
      array 必需。要組合為字串的陣列。
    • explode() 函式使用一個字串分割另一個字串,並返回由字串組成的陣列。

      • 語法:explode(*separator,string,limit*)
      引數 描述
      separator 必需。規定在哪裡分割字串。
      string 必需。要分割的字串。
      limit 可選。規定所返回的陣列元素的數目。可能的值:大於 0 - 返回包含最多 limit 個元素的陣列小於 0 - 返回包含除了最後的 -limit 個元素以外的所有元素的陣列0 - 會被當做 1, 返回包含一個元素的陣列
    • str_split() 函式把字串分割到陣列中。

      • 語法:str_split(*string,length*)
      引數 描述
      string 必需。規定要分割的字串。
      length 可選。規定每個陣列元素的長度。預設是 1。
    • trim() 函式移除字串兩側的空白字元或其他預定義字元。

      • ltrim() - 移除字串左側的空白字元或其他預定義字元。
      • rtrim() - 移除字串右側的空白字元或其他預定義字元
      • 語法:trim(*string,charlist*)
      引數 描述
      string 必需。規定要檢查的字串。
      charlist 可選。規定從字串中刪除哪些字元。如果省略該引數,則移除下列所有字元:"\0" - NULL;"\t" - 製表符;"\n" - 換行;"\x0B" - 垂直製表符;"\r" - 回車" " - 空格
    • substr() 函式返回字串的一部分。

      • 語法:substr(*string,start,length*)
      引數 描述
      string 必需。規定要返回其中一部分的字串。
      start 必需。規定在字串的何處開始。正數 - 在字串的指定位置開始;負數 - 在從字串結尾的指定位置開始;0 - 在字串中的第一個字元處開始
      length 可選。規定要返回的字串長度。預設是直到字串的結尾。正數 - 從 start 引數所在的位置返回;負數 - 從字串末端返回
    • strstr() 函式搜尋字串在另一字串中是否存在,如果是,返回該字串及剩餘部分,否則返回 FALSE。

      • 語法:strstr(*string,search,before_search*)
      引數 描述
      string 必需。規定被搜尋的字串。
      search 必需。規定要搜尋的字串。如果該引數是數字,則搜尋匹配該數字對應的 ASCII 值的字元。
      before_search 可選。一個預設值為 "false" 的布林值。如果設定為 "true",它將返回 search 引數第一次出現之前的字串部分。
    • strtolower() 函式把字串轉換為小寫。

      • strtoupper() - 把字串轉換為大寫
      • lcfirst() - 把字串中的首字元轉換為小寫
      • ucfirst() - 把字串中的首字元轉換為大寫
      • ucwords() - 把字串中每個單詞的首字元轉換為大寫
      • 語法strtolower(*string*)
      引數 描述
      string 必需。規定要轉換的字串。
    • ucfirst() 函式把字串中的首字元轉換為大寫。

      • lcfirst() - 把字串中的首字元轉換為小寫
      • ucwords() - 把字串中每個單詞的首字元轉換為大寫
      • strtoupper() - 把字串轉換為大寫
      • strtolower() - 把字串轉換為小寫
      • 語法:ucfirst(*string*)
      引數 描述
      string 必需。規定要轉換的字串。
    • strpos() 函式查詢字串在另一字串中第一次出現的位置(區分大小寫)。

      • strrpos() - 查詢字串在另一字串中最後一次出現的位置(區分大小寫)
      • stripos() - 查詢字串在另一字串中第一次出現的位置(不區分大小寫)
      • strripos() -查詢字串在另一字串中最後一次出現的位置(不區分大小寫)
      • 語法:strpos(*string,find,start*)
      引數 描述
      string 必需。規定被搜尋的字串。
      find 必需。規定要查詢的字元。
      start 可選。規定開始搜尋的位置。
    • substr_replace() 函式把字串的一部分替換為另一個字串。

      • 語法:substr_replace(*string,replacement,start,length*)
      引數 描述
      string 必需。規定要檢查的字串。
      replacement 必需。規定要插入的字串。
      start 必需。規定在字串的何處開始替換。正數 - 在字串的指定位置開始;負數 - 在從字串結尾的指定位置開始;0 - 在字串中的第一個字元處開始
      length 可選。規定要替換多少個字元。預設是與字串長度相同。正數 - 被替換的字串長度;負數 - 從字串末端開始的被替換字元數;0 - 插入而非替換
    • printf() 函式輸出格式化的字串。

      • arg1、arg2、++ 引數將被插入到主字串中的百分號(%)符號處。該函式是逐步執行的。在第一個 % 符號處,插入 arg1,在第二個 % 符號處,插入 arg2,依此類推。
      • 語法:printf(*format,arg1,arg2,arg++*)
      引數 描述
      format 在後面···
      arg1 必需。規定插到 format 字串中第一個 % 符號處的引數。
      arg2 可選。規定插到 format 字串中第二個 % 符號處的引數。
      arg++ 可選。規定插到 format 字串中第三、四等等 % 符號處的引數。
      • 引數format:

      • 必需。規定字串以及如何格式化其中的變數。

        可能的格式值:

        • %% - 返回一個百分號 %
        • %b - 二進位制數
        • %c - ASCII 值對應的字元
        • %d - 包含正負號的十進位制數(負數、0、正數)
        • %e - 使用小寫的科學計數法(例如 1.2e+2)
        • %E - 使用大寫的科學計數法(例如 1.2E+2)
        • %u - 不包含正負號的十進位制數(大於等於 0)
        • %f - 浮點數(本地設定)
        • %F - 浮點數(非本地設定)
        • %g - 較短的 %e 和 %f
        • %G - 較短的 %E 和 %f
        • %o - 八進位制數
        • %s - 字串
        • %x - 十六進位制數(小寫字母)
        • %X - 十六進位制數(大寫字母)

        附加的格式值。必需放置在 % 和字母之間(例如 %.2f):

        • + (在數字前面加上 + 或 - 來定義數字的正負性。預設情況下,只有負數才做標記,正數不做標記)
        • ' (規定使用什麼作為填充,預設是空格。它必須與寬度指定器一起使用。例如:%'x20s(使用 "x" 作為填充))
        • - (左調整變數值)
        • [0-9] (規定變數值的最小寬度)
        • .[0-9] (規定小數位數或最大字串長度)

    Tip:如果使用多個上述的格式值,它們必須按照上面的順序進行使用,不能打亂。

    • sprintf() 函式把格式化的字串寫入一個變數中。
      • arg1、arg2、++ 引數將被插入到主字串中的百分號(%)符號處。該函式是逐步執行的。在第一個 % 符號處,插入 arg1,在第二個 % 符號處,插入 arg2,依此類推。
      • 語法sprintf(*format,arg1,arg2,arg++*)
      • 引數同printf()
    • str_shuffle() 函式隨機地打亂字串中的所有字元。
      • 語法:str_shuffle(*string*)

面向物件

  • 在面向物件的程式設計(英語:Object-oriented programming,縮寫:OOP)中,物件是一個由資訊及對資訊進行處理的描述所組成的整體,是對現實世界的抽象。

  • 物件的主要三個特性:

    • 物件的行為:可以對 物件施加那些操作,開燈,關燈就是行為。
    • 物件的形態:當施加那些方法是物件如何響應,顏色,尺寸,外型。
    • 物件的表示:物件的表示就相當於身份證,具體區分在相同的行為與狀態下有什麼不同。
  • 定義語法

    class phpClass {
      var $var1;
      var $var2 = "constant string";
      
      function myfunc ($arg1, $arg2) {
         [..]
      }
      [..]
    }
    
    • 類使用 class 關鍵字後加上類名定義。
    • 類名後的一對大括號({})內可以定義變數和方法。
    • 類的變數使用 var 來宣告, 變數也可以初始化值。
    • 函式定義類似 PHP 函式的定義,但函式只能通過該類及其例項化的物件訪問。
  • 示例

    class Site {
      /* 成員變數 */
      var $url;
      var $title;
      
      /* 成員函式 */
      function setUrl($par){
         $this->url = $par;
      }
      
      function getUrl(){
         echo $this->url . PHP_EOL;
      }
      
      function setTitle($par){
         $this->title = $par;
      }
      
      function getTitle(){
         echo $this->title . PHP_EOL;
      }
    }
    
    • 變數 $this 代表自身的物件。
    • PHP_EOL 為換行符。
  • 類建立後,我們可以使用 new 運算子來例項化該類的物件$google = new Site;

  • 在例項化物件後,我們可以使用該物件呼叫成員方法,該物件的成員方法只能操作該物件的成員變數$google->setTitle( "Google 搜尋" ); $google->setUrl( 'www.google.com' ); $google->getTitle(); $google->getUrl();

  • 建構函式

    • 建構函式是一種特殊的方法。主要用來在建立物件時初始化物件, 即為物件成員變數賦初始值,在建立物件的語句中與 new 運算子一起使用。

    • 上面的例子中我們就可以通過構造方法來初始化 $url 和 $title 變數

      function __construct( $par1, $par2 ) {
         $this->url = $par1;
         $this->title = $par2;
      }
      
    • 這樣就可以省略set相關的函數了

      class Site {
        /* 成員變數 */
        function __construct( $par1, $par2 ) {
           $this->url = $par1;
           $this->title = $par2;
        }
        
        /* 成員函式 */  
        function getUrl(){
           echo $this->url . PHP_EOL;
        }
        
        function getTitle(){
           echo $this->title . PHP_EOL;
        }
      }
      
  • 解構函式

    • 解構函式(destructor) 與建構函式相反,當物件結束其生命週期時(例如物件所在的函式已呼叫完畢),系統自動執行解構函式。

    • 示例

         function __destruct() {
             print "銷燬 " . $this->name . "\n";
         }
      
  • 繼承

    • PHP 使用關鍵字 extends 來繼承一個類,PHP 不支援多繼承

    • 示例

      class Child extends Parent {
         // 程式碼部分
      }
      
    • 示例

      class Child_Site extends Site {
         var $category;
      
          function setCate($par){
              $this->category = $par;
          }
        
          function getCate(){
              echo $this->category . PHP_EOL;
          }
      }
      
  • 訪問控制

    • PHP 對屬性或方法的訪問控制,是通過在前面新增關鍵字 public(公有),protected(受保護)或 private(私有)來實現的。
      • public(公有):公有的類成員可以在任何地方被訪問。
      • protected(受保護):受保護的類成員則可以被其自身以及其子類和父類訪問。
      • private(私有):私有的類成員則只能被其定義所在的類訪問。
      • 如果用 var 定義,則被視為公有。
  • 介面

    • 使用介面(interface),可以指定某個類必須實現哪些方法,但不需要定義這些方法的具體內容。

    • 介面是通過 interface 關鍵字來定義的,就像定義一個標準的類一樣,但其中定義所有的方法都是空的。

    • 介面中定義的所有方法都必須是公有,這是介面的特性。

    • 要實現一個介面,使用 implements 操作符。類中必須實現介面中定義的所有方法,否則會報一個致命錯誤。類可以實現多個介面,用逗號來分隔多個介面的名稱。

    • 示例

      // 宣告一個'iTemplate'介面
      interface iTemplate
      {
          public function setVariable($name, $var);
          public function getHtml($template);
      }
      
      
      // 實現介面
      class Template implements iTemplate
      {
          private $vars = array();
        
          public function setVariable($name, $var)
          {
              $this->vars[$name] = $var;
          }
        
          public function getHtml($template)
          {
              foreach($this->vars as $name => $value) {
                  $template = str_replace('{' . $name . '}', $value, $template);
              }
       
              return $template;
          }
      }
      
  • 常量

    • 可以把在類中始終保持不變的值定義為常量。在定義和使用常量的時候不需要使用 $ 符號。

    • 常量的值必須是一個定值,不能是變數,類屬性,數學運算的結果或函式呼叫。

    • 自 PHP 5.3.0 起,可以用一個變數來動態呼叫類。但該變數的值不能為關鍵字(如 self,parent 或 static)。

    • 示例

      class MyClass
      {
          const constant = '常量值';
      
          function showConstant() {
              echo  self::constant . PHP_EOL;
          }
      }
      
      echo MyClass::constant . PHP_EOL;
      
      $classname = "MyClass";
      echo $classname::constant . PHP_EOL; // 自 5.3.0 起
      
      $class = new MyClass();
      $class->showConstant();
      
      echo $class::constant . PHP_EOL; // 自 PHP 5.3.0 起
      
  • 抽象類

    • 任何一個類,如果它裡面至少有一個方法是被宣告為抽象的,那麼這個類就必須被宣告為抽象的。

      定義為抽象的類不能被例項化。

      被定義為抽象的方法只是聲明瞭其呼叫方式(引數),不能定義其具體的功能實現。

      繼承一個抽象類的時候,子類必須定義父類中的所有抽象方法;另外,這些方法的訪問控制必須和父類中一樣(或者更為寬鬆)。例如某個抽象方法被宣告為受保護的,那麼子類中實現的方法就應該宣告為受保護的或者公有的,而不能定義為私有的。

    • 示例

      abstract class AbstractClass
      {
       // 強制要求子類定義這些方法
          abstract protected function getValue();
          abstract protected function prefixValue($prefix);
      
          // 普通方法(非抽象方法)
          public function printOut() {
              print $this->getValue() . PHP_EOL;
          }
      }
      
      class ConcreteClass1 extends AbstractClass
      {
          protected function getValue() {
              return "ConcreteClass1";
          }
      
          public function prefixValue($prefix) {
              return "{$prefix}ConcreteClass1";
          }
      }
      
      class ConcreteClass2 extends AbstractClass
      {
          public function getValue() {
              return "ConcreteClass2";
          }
      
          public function prefixValue($prefix) {
              return "{$prefix}ConcreteClass2";
          }
      }
      
      $class1 = new ConcreteClass1;
      $class1->printOut();
      echo $class1->prefixValue('FOO_') . PHP_EOL;
      
      $class2 = new ConcreteClass2;
      $class2->printOut();
      echo $class2->prefixValue('FOO_') . PHP_EOL;
      
      // 輸出內容
      // ConcreteClass1
      // FOO_ConcreteClass1
      // ConcreteClass2
      // FOO_ConcreteClass2
      
    • 此外,子類方法可以包含父類抽象方法中不存在的可選引數。

      abstract class AbstractClass
      {
          // 我們的抽象方法僅需要定義需要的引數
          abstract protected function prefixName($name);
      
      }
      
      class ConcreteClass extends AbstractClass
      {
      
          // 我們的子類可以定義父類簽名中不存在的可選引數
          public function prefixName($name, $separator = ".") {
              if ($name == "Pacman") {
                  $prefix = "Mr";
              } elseif ($name == "Pacwoman") {
                  $prefix = "Mrs";
              } else {
                  $prefix = "";
              }
              return "{$prefix}{$separator} {$name}";
          }
      }
      
      $class = new ConcreteClass;
      echo $class->prefixName("Pacman"), "\n";
      echo $class->prefixName("Pacwoman"), "\n";
      
      // 輸出
      // Mr. Pacman
      // Mrs. Pacwoman
      
  • Static關鍵字

    • 宣告類屬性或方法為 static(靜態),就可以不例項化類而直接訪問。

      靜態屬性不能通過一個類已例項化的物件來訪問(但靜態方法可以)。

      由於靜態方法不需要通過物件即可呼叫,所以偽變數 $this 在靜態方法中不可用。

      靜態屬性不可以由物件通過 -> 操作符來訪問。

      自 PHP 5.3.0 起,可以用一個變數來動態呼叫類。但該變數的值不能為關鍵字 self,parent 或 static。

  • Final關鍵字

    • PHP 5 新增了一個 final 關鍵字。如果父類中的方法被宣告為 final,則子類無法覆蓋該方法。如果一個類被宣告為 final,則不能被繼承。
  • 呼叫父類的構造方法

    • PHP 不會在子類的構造方法中自動的呼叫父類的構造方法。要執行父類的構造方法,需要在子類的構造方法中呼叫 parent::__construct()

Tip:在PHP中雙冒號(::)操作符是一種範圍解析操作符,又作用域限定操作符。它是對類中的方法的靜態引用,可以訪問靜態、const和類中重寫的屬性與方法。php呼叫類的內部靜態成員,或者是類之間呼叫就要用兩個冒號(: