用 PHP 網住程式

PHP 是門能將伺服端程式內嵌於 HTML 文件裡的表述語言!它使用 C++ 和 Perl 的語法,有 C 語言傳統結構化程式設計的易學、Perl 的動態表述語言的易用、Java 物件導向程式設計的大型專案開發效益,是 2000 年代最能迎合程式設計師撰寫動態網頁程式的語言。

網頁設計師想設計伺服端程式控制的網頁,學 PHP 比較簡單易懂,因為它主要就是針對動態網頁設計所開發的程式語言,不用深厚的程式設計功力就能充分掌握。

當你設計的重點不是網頁,而是設計網站應用程式,適合改用 Ruby on Rails 或其它語言的 Web 框架,快速解決設計程式時網站本身帶來的瑣碎細節。

PHP 沒辦法像 Ruby on Rails 刁鑽靈活的打造網站應用程式,但 Ruby on Rails 沒辦法像 PHP 簡單易用的設計動態網頁,兩者應用不盡相同,PHP 就是比較基本的網頁伺服器而已,Ruby on Rails 則是進階許多的商務網站。需求到哪就選擇真正適合你的程式語言,並不是進階許多的技術就比基本的技術好,需求沒到那兒,用了不會比較有開發效率。


準備


下載 PHP

純粹想練習寫寫動態網頁程式的話,可到 PHP 官方網站 下載程式引擎,不用搭配 Apache HTTP Server 就能跑 PHP 程式。

想架站跑 PHP 程式的話,為免除設定的麻煩,建議下載整合包,一次安裝全都搞定!例如 Apache + MariaDB + PHP + Perl 的 XAMPP

本文示範的程式就是練習用,所以直接拿 PHP 程式引擎來跑。


Hello, world!

PHP 除了與各 HTTP Server 軟體搭配使用,也可單獨當解譯器使用,為作業系統寫腳本跑程式。

用文字編輯器,輸入如下程式碼,並儲存為 main.php:

notepad('main.php','<?php',' echo \'Hello, world!\';','?>')

進入命令提示字元,然後用 PHP 資料夾裡面的 php.exe 執行 main.php,沒問題的話會顯示 Hello, world!:

cmd('C:\\Users\\User\\Desktop>C:\\php-7.1.33-nts-Win32-VC14-x64\\php main.php','Hello, world!','','C:\\Users\\User\\Desktop>_')


Run with built-in web server

php.exe 內建網頁伺服器的功能,切換到存放網頁的目錄,輸入:

php.exe -S 127.0.0.1:80
這樣就能用網頁瀏覽器,輸入 http://127.0.0.1 連上網頁。

要開放區域網路或網際網路連線的話,則須輸入你電腦分配到的 IP 位址。

覺得切換到網頁所在目錄麻煩的話,可以用 -t 參數指定存放網頁的目錄。

預設網頁為 index.phpindex.html,也就是這兩個網頁名稱不用輸入,PHP 網頁伺服器也能連。


Run as interactive shell

php.exe 也有 Shell 模式可用,提供直接以 PHP 語言寫程式的環境:

php.exe -a


目錄


基本語法

原始碼基本架構分號與敘述註解變數資料型態常數陣列迭代字串多行字串運算子流程控制函式匿名函式發布函式構詞命名空間錯誤訊息執行式組態


物件導向

類別物件抽象和介面自動載入例外處理相關函式


命令列程式設計

輸出輸入參數相關函式


動態網頁程式設計

標頭傳送網頁資料暫時保存跨頁資料長期保存網站資料環境變數伺服器資訊相關函式


函式庫

雜類資料型態函式字串正規式陣列數學檔案系統SQLite時間PHP 組態


範例集

list 構詞變數解析preg_match()純文字文件INIXMLDOMXPathJSONCSV偽 HEX 檔案將數值寫入檔案列出所有檔案和子目錄列出能設定的 php.ini 項目


附錄

關於 PHP關於 Thread Safe 版PHP 是最好的網站程式設計語言PEAR 和 PECLUI


很 Perl 的 C 語言

PHP 結合 C++ 和 Perl 兩種語言的語法,基本上採用的是 C 語言手法在寫程式,然後加上 Perl 的動態型別資料簡化 C 語言的工作,所以沒有帶來學習和使用上的負擔,反而更易學易用。而 C++ 的物件導向只是一種輔助語法,團隊開發大型專案時可以用到,用不到時放著不用管它,絲毫不影響你 PHP 的寫作方式。PHP 是多麼清爽的程式語言啊!

總之,大致上會寫 C 程式就會 PHP,所以底下只挑出 Perl 和 C++ 的部分,為 C 語言做補充說明,來介紹 PHP 語法,而不是完整說明。

完整教學,已經有 W3Schools 的《PHP 7 Tutorial》,或「菜鸟教程」翻譯成中文的《PHP 教程》,簡單明瞭、條目詳盡,應該沒人可以寫得比這網站好。

若要取得更詳盡的操作指南,還有官方文件《PHP 手册》,入門者建議從《语言参考》閱讀學習。這官方說明文件不但提供中文翻譯,而且還能下載閱讀,非常實用!


原始碼基本架構

PHP 程式碼寫在如下符號裡面:

<?php

?>

你可以把多個這樣的 PHP 程式碼,隨意插在 HTML 裡面。

不與 HTML 混用的話,可以省略 ?> 結尾符號。

<?php echo 資料?> 可以寫成 <?=資料?>

還有其它風格的符號可用,像是 ASP 風格(<%%>)、HTML 風格(SCRIPT 標籤),有興趣的自行搜尋資料吧~


分號與敘述

PHP 的 ; 並不是一段敘述的結尾,而是將不同段的敘述分隔開來。

因此,若程式只有一道敘述,其實不用加 ; 也能執行。但有多個敘述,就要用 ; 分隔,且最後一個敘述可以不加。

但每段敘述都加 ; 並不會報錯,且大家都這麼寫、也都誤以為 PHP 每行程式要加分號表示結束,所以關於 ; 的事,知道一下就好,不用真的省略~

將錯就錯,有時候是好事。


註解

/* 註解 */
// 註解
# 註解


變數

$ 開頭的識別名稱為變數,不須指定資料型態,由 PHP 自動根據資料配置型別。

大小寫不同,視為不同變數名稱。(但 PHP 的指令和函式不分大小寫。)

在變數前面使用 global 指令,可宣告為全域變數。


資料型態

PHP 有 stringintegerfloatbooleanarrayobjectnull 等型態的資料,由程式引擎自動根據資料配置型態,不需個別宣告。

想強制限定資料型態的話,使用 declare(strict_types=1),就能以 arrayboolcallablefloatintinterfacesstring 宣告型態。

轉型可使用 C 語言的 (型別) 語法,或 setType(變數, 型別) 函式。

布林值使用 truefalse,且保留 C 語言非 0 即 true 的設計。


常數

必須呼叫 define('常數', '資料') 函式定義常數,資料可為陣列的型式。

常數一律全域範疇。

常數不用加上 $ 符號,因此為了容易辨識常數,避免與關鍵字或函式混淆,建議全大寫。

可用 defined(常數) 檢查常數是否已定義。

內定常數(Core predefined constants)

stringDEFAULT_INCLUDE_PATHPHP 載入程式時會尋找的目錄
32767E_ALL所有的錯誤和警報(正式上線用)
64E_COMPILE_ERROR編譯時發生錯誤
128E_COMPILE_WARNING編譯時發出警報
16E_CORE_ERRORPHP 初始啟動時發生錯誤
32E_CORE_WARNINGPHP 初始啟動時發出警報
8192E_DEPRECATED執行期用了將列為警報的功能
1E_ERROR執行期發生錯誤
8E_NOTICE執行期用了將列為錯誤的功能
4E_PARSE編譯時剖析發生錯誤
4096E_RECOVERABLE_ERROR發生可捕獲的錯誤
2048E_STRICT更多所有的錯誤和警報(開發測試用)
256E_USER_ERROR使用者造成錯誤
512E_USER_WARNING使用者造成警報
1024E_USER_NOTICE使用者用了將列為錯誤的功能
16384E_USER_DEPRECATED使用者用了將列為警報的功能
2E_WARNING執行期發出警報
booleanFALSEBoolean 資料型態的假值
nullNULLNull 資料型態的值
stringPEAR_EXTENSION_DIRPEAR 套件目錄位置
stringPEAR_INSTALL_DIRPEAR 安裝目錄位置
stringPHP_BINARYPHP 執行檔的完整路徑和檔名
stringPHP_BINDIRPHP 的 bin(執行檔)目錄存放位置
stringPHP_CONFIG_FILE_PATHphp.ini 的路徑
stringPHP_CONFIG_FILE_SCAN_DIRphp.ini 可掃描的目錄
stringPHP_DATADIRPHP 的 data(資料)目錄存放位置
integerPHP_DEBUG用來判斷除錯模式是否啟用
stringPHP_EOL換行(End Of Line)
stringPHP_EXTENSION_DIRPHP 存放套件的目錄位置
stringPHP_EXTRA_VERSIONPHP 版號中的延伸名稱
stringPHP_FD_SETSIZE最多能選擇多少檔案數量
integerPHP_FLOAT_DIG小數位數.
floatPHP_FLOAT_EPSILON科學記號最小值
floatPHP_FLOAT_MAX小數最大範圍
floatPHP_FLOAT_MIN小數最小範圍
integerPHP_INT_MAX整數最大範圍
integerPHP_INT_MIN整數最小範圍
integerPHP_INT_SIZE整數位元組
stringPHP_LIBDIRPHP 的 lib(程式庫)目錄存放位置
stringPHP_LOCALSTATEDIRPHP 在客端電腦留下資料的目錄
integerPHP_MAJOR_VERSIONPHP 的主要版號。
stringPHP_MANDIRPHP 的 man(手冊)目錄存放位置
integerPHP_MAXPATHLEN檔案名稱最長可用多少字元
integerPHP_MINOR_VERSIONPHP 的次要版號。
stringPHP_OS作業系統種類(例如 WINNT)
stringPHP_OS_FAMILY作業系統名稱(例如 Windows)
stringPHP_PREFIXprefix 參數
integerPHP_RELEASE_VERSIONPHP 的更新版號。
stringPHP_SAPIcli-server 或 cli
stringPHP_SHLIB_SUFFIX動態程式庫的附檔名(例如 dll)
stringPHP_SYSCONFDIRPHP 在客端系統讀取設定的目錄
stringPHP_VERSIONPHP 的主要、次要、更新三個版號
integerPHP_VERSION_IDPHP 版號以五個位數的整數
integerPHP_ZTS判斷 Zend Thread Safety 是否啟用
booleanTRUEBoolean 資料型態的真值
integer__COMPILER_HALT_OFFSET__搭配 __halt_compiler() 時用

魔術常數(Magic constants)

string__CLASS__類別名稱
string__DIR__目前檔案的目錄
string__FILE__目前檔案的完整路徑和檔名
string__FUNCTION__目前的函式名稱或匿名函式的閉包
string__LINE__目前檔案的行數
string__METHOD__目前的方法名稱
string__NAMESPACE__目前的命名空間
string__TRAIT__目前的靜態方法名稱

陣列

串列:

$陣列名稱 = array(值, 值, ...)

雜湊表:

$陣列名稱 = array('鍵'=>值, ...)

陣列解構式:

$串列 = [值, 值, ...]
$雜湊表 = ['鍵'=>值, ...]

陣列解構式是相當實用的語法功能,如果你想交換兩個變數的資料,只要這樣寫:


222
111

過去沒這語法時,都寫成 $temp = $a; $a = $b; $b = $temp


迭代

對於陣列,PHP 提供指令方便我們迭代資料:

foreach($陣列 as $變數){
 程式;
}

foreach($陣列 as $變數=>$變數){
 程式;
}

比必須用 reset() 讓迭代器歸零的 each() 函式方便多了~


字串

除了雙引號,也可以用 ' 單引號表示字串資料。但兩者仍有差異,例如雙引號字串能正常轉換跳脫字元,單引號字串會把倒斜線視為一般字元來顯示(\\ 和 \' 除外):


AAA
BBB
CCC
AAA\nBBB\nCCC\n

雙引號字串內的變數名稱,會直接輸出資料,單引號字串不會:


123
$a

如果變數輸出的資料顯示 Array,請用 {} 符號括住變數,即可取值。

建議用單引號字串,搭配 PHP_EOL 常數解決無法用 \n 換行的問題,因為性能較佳。在需要跳脫字元或自動輸出變數的資料時,才用雙引號字串。

字串使用 . 串接,而不是加號。

字串可以用陣列索引值的語法取出字元,例如 $name[0] 表示 $name 字串變數的第一個字元。


多行字串

PHP 提供 UNIX Shell 的 Here document 功能,適合表現多行字串:

$變數 = <<<標記
 字串
 字串
 字串
標記;

標記裡面的資料,空白和換行會如實呈現,所以裡面的字串就別跟著程式碼縮排了。

字串裡的變數會直接顯示資料,不想這樣的話,可在第一個標記前後加上單引號:

$變數 = <<<'標記'
 字串
標記;


運算子

跟 JavaScript 一樣,除了 ==!=,還提供型別檢查的 ===!==

變數 ?? 值 會檢查變數是否為 NULL,是的話會賦值給變數,相當於「isset(變數) ? 變數 : 值」的寫法。

<=> 用來比較兩個值,小於的話傳回 -1,等於的話傳回 0,大於的話傳回 1。


流程控制

除了傳統用大括號 {} 的寫法,還允許用冒號的寫法:

if(判斷式):
 程式;
elseif(判斷式):
 程式;
else:
 程式;
endif;

switch(判斷式):
 case 值:
  程式;
 default:
  程式;
endswitch;

while(條件式):
 程式;
endwhile;

for(;;):
 程式;
endfor;

if 只能有一個 else,要判斷多個條件,使用 elseif 指令。如果用 C 語言的習慣,會變成巢狀 if 結構,而不是多重條件分支。


函式

函式的基本結構如下:

function 函式名稱($參數=預設值, $參數){
 return 傳回值;
}

函式名稱不分大小寫,因此 fa()、Fa()、FA() 視為同一函式。但參數同變數,區分大小寫。

也可以不寫參數,改用內建函式處理參數:

function 函式名稱(){
 func_get_arg(第幾個引數);
}

或用 func_get_args() 將引數以陣列傳回,放在變數使用。func_num_args() 則可用來取得引數的數量。

不定參數可用 ... 表示。

函式的參數為傳值呼叫,在參數前面使用 & 符號,表示傳址呼叫。

函式裡面的區域變數,可用 static 指令,宣告為靜態變數,即使函式執行完仍保留下來。

呼叫函式不能像 Perl 那樣省略括號。


匿名函式

PHP 支援匿名函式,因此可寫出立即函式:


579
所以直接將函式寫在參數裡面不是問題:


ABC
函式也可以是物件:


ABC
也支援 closure,不過比較麻煩,除了內部函式要使用 use 將想變成 closure 的變數寫出來,還得用 & 將變數宣告為傳址呼叫,才會是我們真正想要的:


456


發布函式

每執行幾次程式,就觸發一次函式:


321Hello!!


構詞

PHP 有一種長得像函式,用起來卻像指令一樣執行效率高、有些還可省略括號的東西,叫做 language construct,表示構成語言的要素。有:

arrayarray()建立陣列
voiddie([狀態值或訊息文字])結束程式的執行
voidecho(字串, ...)輸出一或多個字串
booleanempty(變數)檢查變數是否為空
mixedeval(字串)執行寫成字串的 PHP 程式碼
voidexit([狀態值或訊息文字])die() 的別名
integerinclude(檔案)載入外部程式碼檔案(載入失敗仍會繼續執行)
integerinclude_once(檔案)載入外部程式碼檔案且不重複載入
booleanisset(變數, ...)檢查變數是否已設值
arraylist(變數, ...)將陣列的資料分拆到多個變數
integerrequire(檔案)請求外部程式碼檔案(請求失敗會報錯並終止執行)
integerrequire_once(檔案)請求外部程式碼檔案且不重複請求
voidunset(變數, ...)解除變數

基本上這是種已經最佳化編譯好的函式,不像函式需要直譯後執行,因此性能極高,甚至比指令還高。


命名空間

namespace 設定命名空間,並以 use 使用命名空間。


錯誤訊息

程式敘述前面使用 @ 可以忽略錯誤訊息。


執行式

以一對 ` 括住的字串,會以作業系統的指令模式執行。

例如 `ver`,等於在 Windows 的命令提示字元執行 ver 指令,顯示作業系統的版本。


組態

可透過 php.ini 設定 PHP 程式語言環境的功能。


物件導向

PHP 4 時就有簡單的物件導向功能,雖然只有類別和繼承,但對弱型別的表述語言來說其實也夠用了。只是當時 Java 語言稱霸程式設計,誰沒跟上它的物件導向機制,就像沒辦法打造走在時代尖端技術的程式碼一樣,使用者強逼 PHP 5 照抄了一套來用。

在 PHP 5 推出的 2004 年,我完全無法想像 Java 語言的物件導向,在十年後反而是種落後時代的技術表現。隨著函數式程式設計興起,人們漸漸接觸動態型別的表述語言,發現其實都處理得很好,利大於弊,於是開始對強型別感到厭煩。Java 走在時代尖端的那套技術,如今被視為沒有寫作效率的程式寫法了~

時代確實不一樣了!如果從頭到尾都用同一個程式語言開發專案,你確實離不開 Java 語言那樣的物件導向功能,來管理終將變得巨大無比的程式碼。但現在開發的專案,比較常見的是發揮不同程式語言的特性來解決問題,因此接觸到的是各種語言寫成的小而美程式,確實用不到那套物件導向業界標準了!

現在欠缺的是新一套開發標準,如何更有效率地將開放原始碼倉庫中用不同語言做好的解決方案,結合起來完成想要的專案…將在 2020 年代有重大轉變。


類別

類別的語法有:

class 類別名稱 extends 父類別{

 const 常數 = 初始值;

 var $屬性 = 初始值;

 function 方法($參數){
  程式;
 }

 function __construct(){
  建構式;
 }

 function __destruct(){
  解構式;
 }

 function __set(){
  設定不存在的屬性時執行程式;
 }

 function __get(){
  取出不存在的屬性時執行程式;
 }

 function __call(){
  呼叫不存在的方法時執行程式;
 }

}

var 可改用 publicprivateprotected 限制存取範疇,方法前面也可加上去。

類別的屬性和方法可用 static 宣告為靜態,在不建立物件的情況下以 類別名稱::屬性或方法 方式存取。

方法可用 final 禁止覆寫。

可用 $this 表示物件自己,但無法存取 static 屬性和方法,因為這不是物件的一部分,而是類別的。因此 PHP 5 後,新增 self 表示類別自己,以及 parent 表示父類別。


物件

$物件名稱 = new 類別名稱();
$物件名稱->屬性或方法;

複製物件使用 clone 指令。


抽象和介面

可用 abstractinterface 設計抽象和介面。


自動載入

PHP 沒有 package 的設計,因此外部類別是用 require 一個個載入的,沒有 import php.util.* 這類一次載入所有類別的寫法。變通的方式,就是覆寫 __autoload(),當 PHP 引擎找不到類別時,自動執行裡面的程式。

function __autoload($class){
 require_once("存放類別的目錄/$class.php");
}

這項功能將廢棄,改用 spl_autoload_register() 代替。


例外處理

trycatchthrow…在 PHP 可有可無,就不介紹了。


相關函式

booleanclass_exists(類別)檢查是否定義了類別
arrayget_declared_classes()取得已定義的所有類別
arraymethod_exists(物件, 方法)檢查物件是否擁有方法
arrayget_class_vars(類別)取得類別所有屬性
arrayget_class_methods(類別)取得類別所有方法
arrayget_object_vars(物件)取得物件所有屬性
booleanis_a(物件, 類別)檢查物件是否為類別的實體
booleanis_subclass_of(物件, 父類別)檢查物件是否為父類別的子類別
stringget_class(物件)查詢物件是哪個類別
stringget_parent_class(物件)查詢物件的父類別
stringserialize(物件)將物件轉為字串(序列化物件)
mixedunserialize(字串)轉序列化字串為物件

命令列程式設計

PHP 從 4.2 版便實驗性的推出 Command Line Interface 計畫,讓 PHP 也能做為電腦應用程式的表述語言,並在 4.3 正式成為 PHP 主要功能。

雖然做為動態網頁程式設計的表述語言,PHP 內建的程式庫都集中在 HTTP 伺服端功能上,且有忽視作業系統相關功能的傾向,因此不太可能像 Python 這樣的表述語言實用,甚至顯得不適合、功能有限、自討沒趣…

不過這種自討沒趣卻又挺有趣的 XDDDDDD

事實上,PHP 官方提供了許許多多需要另外安裝的模組,連 GUI 都有!用 PHP 寫電腦應用程式並非不可行~


輸出

echo

如果使用多次 echo 構詞:

echo 'AAA';
echo 'BBB';
echo 'CCC';

不妨考慮用逗號寫在一起:

echo 'AAA', 'BBB', 'CCC';

你可能會覺得這樣不如用句號接在一起把字串接好,再送給 echo,只執行一次就好:

echo 'AAA'.'BBB'.'CCC';

不過執行多次 echo,要比把字串接起來更有效率,因為串接字串的工作量要比執行多次 echo 來得繁重,而且 echo 是特別優化過的,不怕多執行幾次,只怕你不知道要盡量用 echo 提升效率。

print

print 是指令,但速度反而沒有構詞的 echo 來得好。

printf()

printf() 提供格式化輸出的功能:


歡迎光臨,abc,你是第 123 位來賓
%d  整數
%f  小數
%c  字元
%s  字串
%b  二進位值
%u  十進位值
%o  八進位值
%x  十六進位值

其它

print_r() 輸出陣列和物件的資料結構。
var_dump() 輸出資料的詳細情報。
var_export() 輸出資料的簡單情報。


輸入

命令列模式的輸入,使用 readline('說明文字') 函式。


參數

若以直譯器的方式執行 PHP 程式碼時,隨後附加參數:

pnp.exe main.php -abc -123
那 PHP 程式碼可以用 $argv[0] $argv[1] 之類的系統變數取得參數。


相關函式

stringexec(程式)執行外部程式並傳回結果
voidpassthru(程式)執行外部程式並顯示結果
stringsystem(程式)執行外部程式並顯示與傳回結果
stringshell_exec(命令)以作業系統執行命令並傳回結果

動態網頁程式設計

伺服端程式設計是 PHP 的強項!程式庫幾乎都是繞著 HTTP Server 設計的,連 Web Service 都能兩三行搞定,就知道拿 PHP 設計網頁伺服器有多好用了。

標頭

寫 PHP 動態網頁時,經常使用如下函式設定標頭,例如文件的字元編碼:

header('Content-Type: text/plain; charset: utf-8');


傳送網頁資料

使用 HTML 的 FORM 系列元件送出填表資料,然後用 $_GET['元件名稱']$_POST['元件名稱'] 接收。

不確定送出的資料是哪一種方式,可根據 $_SERVER['REQUEST_METHOD']'GET' 還是 'POST' 來設計。

若上傳的資料包含檔案,則用 $_FILES 處理。


暫時保存跨頁資料

這是一種暫時保存共用資料,當瀏覽結束就自動釋放資料,不會在使用者電腦留下紀錄的設計,適合用來跨頁傳遞資料。

先用 session_start() 啟動暫存功能,就能以 $_SESSION['識別名稱'] 跨頁存取資料。完成工作後,使用 session_destroy() 清除資料。

長期保存網站資料

Cookie 是瀏覽器提供長期保存資料的功能,透過 JavaScript 就能寫入和讀取。

PHP 有自己更易用的實作方式,寫入用 setcookie('識別名稱', '資料', 期限),讀取用 $_COOKIE['識別名稱']


刪除 Cookie 的方式,則是把資料清空,或把期限設為過期:


Cookie 也可做為跨頁傳遞資料的技術,尤其寫入資料時,省略第三個參數,用起來就類似 Session,在關閉瀏覽器時失效。缺點是有可能在使用者電腦留下「空資料」的紀錄,但優點是不像 Session 把資料放在伺服器增加負擔。


環境變數

$_ENV 可用來取得作業系統的環境變數,像是 $_ENV['OS'] 傳回作業系統、$_ENV['USERNAME'] 傳回使用者名稱、$_ENV['HOMEPATH'] 傳回使用者家目錄。


伺服器資訊

$_SERVER 可用來取得系統的資訊,隨不同伺服器系統,會有不一樣的情況,不清楚時,可先用 print_r() 全列出來。常用到的資訊有:

$_SERVER['HTTP_ACCEPT']
$_SERVER['HTTP_ACCEPT_CHARSET']
$_SERVER['HTTP_ACCEPT_ENCODING']
$_SERVER['HTTP_ACCEPT_LANGUAGE']
$_SERVER['HTTP_CONNECTION']
$_SERVER['HTTP_HOST']
$_SERVER['HTTP_REFERER']
$_SERVER['HTTP_USER_AGENT']
$_SERVER['PHP_SELF']
$_SERVER['QUERY_STRING']
$_SERVER['REMOTE_ADDR']
$_SERVER['REMOTE_HOST']
$_SERVER['REQUEST_METHOD']
$_SERVER['REQUEST_URI']
$_SERVER['REMOTE_PORT']
$_SERVER['SERVER_ADMIN']
$_SERVER['SERVER_NAME']
$_SERVER['SERVER_PORT']
$_SERVER['SERVER_PROTOCOL']
$_SERVER['SERVER_SIGNATURE']
$_SERVER['SERVER_SOFTWARE']


相關函式

integerignore_user_abort(布林)與客端斷線時是否終止程式繼續執行
mixedget_browser()取得瀏覽器的訊息
mixedhighlight_file(檔案)以色彩標示程式檔
mixedhighlight_string(字串)以色彩標示程式碼
stringhtmlentities(字串)將字串中的 & ' " < > 轉為 HTML 實體
stringrawurlencode(字串)將字串中的白字元換成 URI 編碼
stringrawurldecode(字串)恢復字串中的 URI 編碼
stringurlencode(字串)將字串編碼為 URI 字元
stringurldecode(字串)將 URI 字元解碼為字串
stringaddslashes(字串)將字串中的 ' " \ NULL 換成跳脫字元
stringstripslashes(字串)恢復字串中的跳脫字元
mixedparse_url(字串)拆解 URL 字串為 scheme、user、password、host、port、path、query、fragment 等部分

函式庫

更多且詳盡的函式庫,請看官方說明文件《Function Reference》。


雜類

stringphp_strip_whitespace(檔名)取得 PHP 程式碼字串
integersleep(秒數)暫停幾秒再執行往後的程式(只能正整數)
stringuniqid(前綴, 後綴)以當前時間的微秒數產生 ID 碼

資料型態

檢查

booleanis_bool(變數)檢查變數是否為 boolean 資料型態
booleanis_int(變數)檢查變數是否為 integer 資料型態
booleanis_float(變數)檢查變數是否為 float 資料型態
booleanis_string(變數)檢查變數是否為 string 資料型態
booleanis_array(變數)檢查變數是否為 array 資料型態
booleanis_object(變數)檢查變數是否為 object 資料型態
booleanis_null(變數)檢查變數是否為 null 型態

轉換

booleansettype(變數, 型態)轉換變數的資料型態
integerintval(變數)將變數轉為 integer 資料型態
floatfloatval(變數)將變數轉為 float 資料型態
stringstrval(變數)將變數轉為 string 資料型態

其它

arrayget_defined_vars()取得所有定義的變數
stringgettype(變數)取得變數的資料型態

函式

arrayget_defined_functions()取得所有定義的函式
booleanfunction_exists(函式)檢查函式是否已定義

字串

資料

stringstrstr(字串, 資料[,長度])傳回資料後面多大長度的字串
stringstristr(字串, 資料)不分大小寫傳回資料後面的字串
stringstrrchr(字串, 資料)從字串後面開始找資料並傳回後面的字串
stringsubstr(字串, 位置, 長度)擷取字串
stringstr_repeat(字串, 次數)重複字串
stringstrtok(字串, 字元)依字元分割字串(第一次先用這函式)
stringstrtok(字元)依字元分割字串(第二次以後改用這函式)

編輯

mixedstr_replace(舊資料, 新資料, 字串)改寫字串中的資料
mixedstr_ireplace(舊資料, 新資料, 字串)不分大小寫改寫字串中的資料
mixedsubstr_replace(字串, 資料, 從, 到)取代字串中的資料
stringstrtr(字串, 雜湊表)用雜湊表改寫字串中的資料
stringstrtr(字串, 從, 到)取出字串中的資料
stringstr_pad(字串, 長度, 字元)依字串長度填滿字元
stringstrrev(字串)倒轉英文字母(非英文的 2 bytes 字元會亂碼)
stringstr_shuffle(字串)打亂字串的字元順序
stringstrtoupper(字串)轉為大寫字母
stringstrtolower(字串)轉為小寫字母
stringucfirst(字串)第一個字母轉為大寫
stringucwords(字串)每個單字的首字母轉為大寫
stringtrim(字串[,自訂字元])刪除頭尾空白或自定字元
stringltrim(字串[,自訂字元])刪除開頭空白或自定字元
stringrtrim(字串[,自訂字元])刪除結尾空白或自定字元
stringchunk_split(字串, 字數)依字數拆成多行文字
stringwordwrap(字串, 字數)依字數拆成多行文字且自動加上換行字元

計算

integerstrpos(字串, 資料)尋找資料出現位置
integerstrrpos(字串, 資料)尋找資料最後出現的位置
integerstrlen(字串)字串長度
integersubstr_count(字串, 資料)統計字串中資料出現次數
mixedcount_chars(字串)統計 ASCII 字元出現次數
mixedstr_word_count(字串, 資料)統計資料出現次數
integerstrspn(字串, 資料)統計資料出現的字數
integerstrcspn(字串, 資料)統計資料未出現的字數
integerstrcmp(字串, 字串)比較字串大小(相等 0,較大 1,較小 -1)
integerstrcoll(字串, 字串)依系統設置比較字串大小(有些系統 A 字元 > a 字元)
integerstrcasecmp(字串, 字串)不分大小寫比較字串大小
integerstrnatcmp(字串, 字串)以自然排序比較字串大小(尤其數字)
integerstrnatcasecmp(字串, 字串, 長度)以自然排序不分大小寫比較字串大小
integerstrncmp(字串, 字串, 長度)最大長度內比較字串大小(有時候字串長得嚇人不適合從頭比到尾)
integerstrncasecmp(字串, 字串, 長度)最大長度內不分大小寫比較字串大小
integersimilar_text(字串, 字串)統計兩字串資料相同數
integerlevenshtein(字串, 字串)統計兩字串資料不同數
integersubstr_compare(字串, 資料, 位置)比較字串和資料

轉換

stringchr(字元編碼)轉為字元
integerord(字元)轉為字元編碼
stringbin2hex(字串)轉十六進位表示法
stringpack(格式, 字串)將資料轉為 binary string(格式
arrayunpack(格式, 字串)將 binary string 轉為資料(格式
arraystr_split(字串)將字串轉為陣列
mixedsscanf(字串, 格式, 資料, ...)格式化產生字串(格式
stringaddslashes(字串)將 ' " \ NULL 轉為跳脫字元
stringaddcslashes(字串, 格式)將格式中列出的符號轉為跳脫字元
stringquotemeta(字串)將 $ ^ * () + [ ] \ . ? 轉為跳脫字元
stringstripslashes(字串)還原 ' " \ NULL 跳脫字元
stringstripcslashes(字串)還原所有跳脫字元
stringstr_rot13(字串)以 ROT13 編碼加密字串(加密過的字串再加密一次就能解碼)
stringmd5(字串)以 MD5 編碼加密字串(無法解碼)
stringsha1(字串)以 SHA1 編碼加密字串(無法解碼)
stringcrypt(字串)隨作業系統採用不同編碼加密字串(無法解碼)
voidparse_str(字串)剖析 URL 參數中 k1=v&k2=v...

正規式

integerpreg_match(正規式, 字串)匹配字串中的資料
integerpreg_match_all(正規式, 字串)匹配字串中所有資料
arraypreg_grep(正規式, 陣列)匹配陣列中的資料
mixedpreg_replace(正規式, 取代, 字串)取代字串中的資料
mixedpreg_replace_callback(正規式, 函式, 字串)用回呼函式取代字串中的資料
arraypreg_split(正規式, 字串)分割字串
stringpreg_quote(字串[,自訂])將正規式符號轉為跳脫字元

陣列

通用

integerarray_push(陣列, 資料)在尾端追加資料
mixedarray_pop(陣列)移除尾端資料
integerarray_unshift(陣列, 資料)在頭端加入資料
mixedarray_shift(陣列)移除頭端資料
mixedreset(陣列)移至第一個順序
mixedend(陣列)移至最後一個順序
mixednext(陣列)移至下一個順序
mixedprev(陣列)移至上一個順序
mixedcurrent(陣列)取得當前順序的資料
arrayarray_slice(陣列, 開始, 長度)擷取一串資料
arrayarray_splice(陣列, 開始, 長度)刪除一串資料
arrayarray_unique(陣列)刪除重複資料(以新陣列傳回結果)
numberarray_sum(陣列)所有資料的總和
arrayarray_count_values(陣列)統計資料的出現次數(以雜湊表保存)
mixedarray_rand(陣列, 數量)隨機串列索引值或雜湊鍵
integercount(陣列)取得陣列數量
booleanin_array(資料, 陣列)陣列中是否有這筆資料
mixedarray_search(資料, 陣列)搜尋資料並傳回索引值或雜湊鍵
arrayarray_diff(陣列, ...)比較多個陣列資料的差異處
arrayarray_diff_assoc(陣列, ...)比較多個陣列資料和索引的差異處
arrayarray_udiff(陣列, ..., 函式)用函式自訂條件比較多個陣列資料的差異
arrayarray_intersect(陣列, ...)比較多個陣列資料的相同處
arrayarray_intersect_assoc(陣列, ...)比較多個陣列資料和索引的相同處
arrayarray_merge(陣列, ...)合併多個陣列且覆蓋重複的資料
arrayarray_merge_recursive(陣列, ...)合併多個陣列但重複時用多維陣列並存

串列

arrayrange(從, 到)產生範圍內資料的陣列
arrayarray_pad(陣列, 長度, 資料)加入多個資料
booleansort(陣列)不自然排序(1,10,2,3)
booleanrsort(陣列)遞減排序
booleannatsort(陣列)自然排序(1,2,3,10)
booleannatcasesort(陣列)不分大小寫的自然排序
booleanusort(陣列, 函式)用函式自訂條件排序陣列資料
booleanarray_multisort(陣列[,遞減,型態], 陣列[,遞減,型態])排序多個陣列
booleanshuffle(陣列)亂排資料
arrayarray_reverse(陣列)反轉資料(以新陣列傳回結果)
arrayarray_chunk(陣列, 長度)依長度將陣列拆為多個小陣列
stringimplode(符號, 陣列)將陣列轉為以符號分隔的字串
arrayexplode(符號, 字串)依分隔符號將字串轉為陣列

雜湊表

mixedkey(陣列)取得鍵
arrayarray_keys(陣列)取得所有的鍵
arrayarray_values(陣列)取得所有的值
arrayarray_change_key_case(陣列[,CASE_UPPER|CASE_LOWER])將鍵轉為全大寫或小寫
booleanksort(陣列)依鍵遞增排序
booleankrsort(陣列)依鍵遞減排序
booleanasort(陣列)依值遞增排序
booleanarsort(陣列)依值遞減排序
booleanuksort(陣列, 函式)用函式自訂條件排序鍵
booleanuasort(陣列, 函式)用函式自訂條件排序值
arrayarray_diff_uassoc(陣列, ..., 函式)用函式自訂條件比較多個陣列的鍵之差異
arrayarray_udiff_assoc(陣列, ..., 函式)用函式自訂條件比較多個陣列的值之差異
arrayarray_udiff_uassoc(陣列, ..., 函式)用函式自訂條件比較多個陣列的鍵和值之差異
arrayarray_flip(陣列)將鍵和值對調
integerextract(陣列)將雜湊表轉為多個以鍵為名稱、值為資料的變數
arraycompact(變數, ...)將變數轉為以名稱為鍵、資料為值的雜湊表
arrayarray_combine(陣列, 陣列)合併陣列為雜湊表,第一個陣列為鍵,第二個為值。

進階

arrayarray_map(函式, 陣列, ...)操作多個陣列(需用回呼函式設計)
arrayarray_filter(陣列, 函式)篩選資料(需用回呼函式設計)
mixedarray_reduce(陣列, 函式)將陣列削減成一筆資料(需用回呼函式設計)
booleanarray_walk(陣列, 函式)設計布林算式走訪陣列資料(需用回呼函式設計)

數學

不分類

booleanis_finite(數值)判斷是否為有限值
booleanis_infinite(數值)判斷是否為無限值
booleanis_nan(數值)判斷是否非數值
mixedmax(數值, 數值, ...)取得最大值
mixedmin(數值, 數值, ...)取得最小值
floatfmod(被除數, 除數)取餘數
numberpow(數值, 次方)取得數值的次方
floatsqrt(數值)數值的平方根
numberabs(數值)絕對值
floatround(數值)四捨五入
floatfloor(數值)無條件捨去
floatceil(數值)無條件進位
voidsrand([數值])打亂隨機數
integerrand(從, 到)取得隨機數
integermt_rand(從, 到)以 Mersenne Twister 演算法取得隨機數
floatlcg_value()取得 0.0 到 1.0 之間的隨機數

科學

floatlog(數值, 基底)取得對數
floatlog10(數值)取得以 10 為基底的對數
floatexp(次方)自然底數的次方
floatpi()取得圓周率
floatsin(數值)三角函數的正弦
floatcos(數值)三角函數的餘弦
floattan(數值)三角函數的正切

進位

stringdecbin(數值)十進制轉二進制
stringdechex(數值)十進制轉十六進制
stringdecoct(數值)十進制轉八進制
numberbindec(數值)二進制轉十進制
numberoctdec(數值)八進制轉十進制
numberhexdec(數值)十六進制轉十進制
stringbase_convert(數值, 從, 到)從 2~36 進制轉到 2~36 進制

檔案系統

路徑

stringrealpath(路徑)取得絕對路徑
mixedpathinfo(路徑)將路徑拆解為 dirname、basename、extension、filename 並傳回雜湊表
stringdirname(路徑)取得絕對路徑
stringrealpath(路徑)取得絕對路徑

目錄

booleanmkdir(命名, 模式)新增目錄
booleanrmdir(目錄)刪除目錄
booleanchdir(目錄)切換目錄
stringgetcwd()取得當前目錄
resourceopendir(目錄)開啟目錄
stringreaddir(opendir)讀取目錄的檔名(一次一個)
voidrewinddir(opendir)重設 readdir 走訪位置
voidclosedir(opendir)關閉目錄(才能再 opendir 同個目錄)
arrayscandir(路徑[,1])讀取目錄內容、1 為降冪
stringdirname(路徑)取得根目錄名稱

檔案

booleantouch(檔名)建立空白檔案
integerreadfile(檔名)顯示純文字文件的內容
integerfpassthru(檔名)顯示二進制檔案內容
arrayfile(檔名)讀取檔案內容
stringfile_get_contents(檔名)讀取檔案內容
intfile_put_contents(檔名, 字串[,FILE_APPEND])寫入檔案內容
booleancopy(檔名, 目的)複製檔案
booleanunlink(檔名)刪除檔案
stringbasename(路徑)取得檔名(不含副檔名)
R1fopen(檔名, 'r|w|a|+|b|t')新增或開啟檔案(read、write、append 和 binary、text)
booleanflock(R1, LOCK_EX)禁止再有程式開啟 fopen() 檔案
stringfread(R1, 大小)讀取 fopen() 檔案的內容
stringfgetc(R1)讀取 fopen() 檔案一個字元
stringfgets(R1)讀取 fopen() 檔案一行字串
stringfgetss(R1)讀取 fopen() 檔案的內容並刪除 HTML 標籤
integerfwrite(R1, 字串)寫入字串到 fopen() 檔案
integerfputs(R1, 字串)fwrite() 的別名
integerfprintf(R1, 格式, 字串, ...)用格式化寫入字串到 fopen() 檔案
integervfprintf(R1, 格式, 陣列)用格式化寫入陣列到 fopen() 檔案
intset_file_buffer(R1, 大小)設定寫入資料到 fopen() 所開啟檔案的緩衝區大小
boolftruncate(R1, 大小)將 fopen() 開啟的檔案切割到只剩指定大小
booleanrewind(R1)重設 fopen() 檔案讀寫位置
integerfseek(R1, 位移)移動 fopen() 檔案讀寫位置
integerftell(R1)取得 fopen() 檔案讀寫位置
booleanfeof(R1)檢查 fopen() 檔案讀寫位置是否結尾
booleanfclose(R1)關閉 fopen() 開啟的檔案
R1tmpfile()建立會自動刪除檔案的 fopn()
stringtempnam(目錄, 詞綴)指定 tmpfile 的存放位置與命名詞綴
arrayglob(規則)依匹配規則尋找路徑和檔名。

通用

booleanrename(檔名, 命名)重新命名檔案或目錄
arraystat(檔名)取得檔案或目錄的詳細資訊
arraylstat(檔名)同 stat() 但多了捷徑的詳細資訊
voidclearstatcache()清除舊快取以更新檔案或目錄的資訊
integerfilectime(檔名)取得檔案或目錄建立日期
integerfilemtime(檔名)取得檔案或目錄修改日期
integerfileatime(檔名)取得檔案或目錄存取日期
integerfileperms(檔名)取得檔案或目錄的權限
integerfileowner(檔名)取得檔案或目錄的使用者
integerfilegroup(檔名)取得檔案或目錄的群組
integerfilesize(檔名)取得檔案或目錄大小
stringfiletype(檔名)傳回檔名的檔案系統種類

檢查

booleanfile_exists(檔名)檢查檔案或目錄是否存在
booleanis_dir(檔名)檢查是否為目錄
booleanis_executable(檔名)檢查是否為執行檔
booleanis_file(檔名)檢查是否為檔案
booleanis_link(檔名)檢查是否為捷徑
booleanis_readable(檔名)檢查是否可讀
booleanis_writeable(檔名)檢查是否可寫

SQLite

SQLite file resource

R2sqlite_open(檔案)開啟 SQLite 檔案
boolsqlite_exec(R2, 語法)執行 SQL 語法
arraysqlite_single_query(R2, 語法)執行 SQL 語法並提取下一筆紀錄為陣列
arraysqlite_array_query(R2, 語法)執行 SQL 語法並提取每第一欄資料
integersqlite_changes(R2)傳回最後一次更動多少資料筆數
integersqlite_last_insert_rowid(R2)查詢最近插入之紀錄的 ID
voidsqlite_close(R2)關閉 SQLite 檔案

Query resource

R3sqlite_query(R2, 語法)執行 SQL 語法並傳回結果
R3sqlite_unbuffered_query(R2, 語法)執行 SQL 語法並傳回結果(不快取不緩衝,直接搜尋資料。)
arraysqlite_fetch_array(R3)提取傳回結果下一筆紀錄為陣列
objectsqlite_fetch_object(R3)提取傳回結果下一筆紀錄為物件
stringsqlite_fetch_single(R3)提取傳回結果下一筆紀錄第一欄資料
mixedsqlite_column(R3, 索引)提取傳回結果第幾筆紀錄中的欄位
stringsqlite_field_name(R3, 索引)取得欄位名稱
integersqlite_num_rows(R3)取得紀錄筆數
integersqlite_num_fields(R3)取得欄位數
booleansqlite_seek(R3, 筆數)移動到第幾筆紀錄
booleansqlite_next(R3)移動到下一筆紀錄
booleansqlite_prev(R3)移動到上一筆紀錄
booleansqlite_rewind(R3)移動到第一筆紀錄
arraysqlite_current(R3)提取傳回結果的當前紀錄為陣列
booleansqlite_has_more(R3)是否有下一筆紀錄
booleansqlite_valid(R3)是否有下一筆紀錄的資料
booleansqlite_has_prev(R3)是否有上一筆紀錄

Other

stringsqlite_escape_string(字串)轉換 SQLite 適用的跳脫字元
stringsqlite_libversion()傳回 SQLite 的版號
stringsqlite_libencoding()傳回 SQLite 的字元編碼系統
voidsqlite_busy_timeout(毫秒)修改系統忙碌的逾時(預設 60000)
stringsqlite_error_string(R2)取得錯誤訊息
integersqlite_last_error(R2)取得錯誤代碼

時間

integertime()取得電腦當前 POSIX 時間
integermktime(時,分,秒,月,日,年)依參數產生 POSIX 時間
integerstrtotime(字串)解析字串中的時間格式成 POSIX 時間
stringdate(格式)依指定格式輸出 POSIX 時間(格式

PHP 組態

booleanphpinfo()輸出 php.ini 的設定
stringini_get(項目)取得 php.ini 的設定
stringini_set(項目, 設定)設定 php.ini 的組態(非全部能改)
voidini_restore()還原 php.ini 原先的組態

範例集


list 構詞

將陣列的資料分拆到多個變數:


AAA
BBB
CCC

但 list() 的功能,可用陣列解構式完成:


變數解析


ABC
ABC


preg_match(), preg_replace(), preg_split()


有院子嘛~
[庭院]
[髒髒]
[髒幾許]


純文字文件

寫入


AAA
BBB
CCC

讀取

sample.txt

main.php


AAA
BBB
CCC

其它


AAA
BBB
CCC


INI

只內建讀取的函式,沒有寫入。

sample.ini

main.php


Twideem Civs
twideem@outlook.com


XML

SimpleXML 可以用來讀取、編輯、儲存 XML 資料,但不能新增元素和屬性。想新增的話,要改用像腳綁著鐵球闖複雜迷宮一樣難度的 DOM。

讀取 XML 檔案

sample.xml

main.php


Twideem Civs
twideem@outlook.com

儲存 XML 檔


<?xml version='1.0' encoding='UTF-8'?>
<sample>
  <user>Twideem Civs</user>
  <email>twideem@outlook.com</email>
</sample>

存取 XML 元素

sample.xml

main.php


Twideem Civs
twideem@outlook.com
Raideem Toukin
raideem@gmx.com

一個子元素時,用 -> 存取。

多個同名子元素時,用 [索引編號] 存取,或 children() 傳回陣列存取。

屬性用 [屬性名稱] 存取,或 attributes() 傳回陣列存取。

刪除元素或屬性

使用 unset() 函式。


DOM

DOM 是相當難用的 API,不過底下範例化繁為簡,只用到部分功能,能「存、取、增、刪」就好。詳盡功能,請參考 PHP 官方文件《Document Object Model》。

載入 XML 文件並讀取元素和屬性

document.xml

main.php


Header
figure.png
640
插圖
html=

 Header
 Paragraph 1
 Paragraph 2
 Paragraph 3



src=figure.png
width=640
alt=插圖

載入 XML 文件並修改元素和屬性

document.xml

同上。

main.php


<?xml version="1.0" encoding="UTF-8"?>
<html>
 <article>
  <h1>Header</h1>
  <p>AAA</p>
  <p>BBB</p>
  <p>CCC</p>
  <img src="picture.jpg" width="320" alt="相片"/>
 </article>
</html>

建立空白 XML 文件並新增元素和屬性


<?xml version="1.0" encoding="UTF-8"?>
<root>
 <element attribute="value">content</element>
</root>

載入 XML 文件並移除元素和屬性

你可能會疑惑,DOM 為何被嫌得臭頭?看完這一節範例,你就知道原因了…

document.xml

同上上。

main.php


<?xml version="1.0" encoding="UTF-8"?>
<html>
 <article>
  <h1>Header</h1>
  
  <p>Paragraph 2</p>
  <p/>
  <img src="figure.png" alt="插圖"/>
 </article>
</html>

首先看刪除元素,做法是先取得要刪除的元素,再從它的父元素呼叫 removeChild() 去刪除子元素。然後看刪除內容,做法是取得元素後,呼叫 removeChild() 刪除自己的第一個子元素;前提是這個元素的第一個子元素是內容結點,如果是包含各種類型的節點,請逐一檢查 nodeType 屬性是不是 XML_TEXT_NODE。刪除屬性呢?取得元素後,呼叫 removeAttribute() 刪除屬性。而且從範例輸出的 other.xml 來看,移除 P 元素後,仍留下一種叫文字節點的東西需要刪除。

可以看到,元素、內容、屬性的刪除方式,竟然都不一樣。而且刪除時可能還得一個一個檢查結點的種類,對了再刪。不然就是反過來,刪完後恐怕還得再刪其它種類的節點,才是你想要的結果~

DOM 真是了不起的發明!常用 DOM 就像多玩益智遊戲一樣,能促進腦力激盪,集中注意力,防止癡呆…我並不討厭 DOM 的設計,反而很喜歡就 DOM 的規則,玩一場又一場的益智遊戲,跟魔術方塊一樣有趣。


XPath

XPath 可簡化 DOM 取得節點的工作,甚至可以篩選資料。

下面範例為三井寿射進三分球,所以添加到他的得分紀錄中。

湘北高等学校.xml

main.php


27

SimpleXML 產生的物件,本身自帶 xpath() 方法,將 XPath 語法傳進參數,會傳回 SimpleXMLElement 的陣列。

更詳盡 XPath 操作方式,請參考「菜鸟教程」的《XPath 语法》。


JSON


{"name":"Twideem Civs","email":"twideem@outlook.com"}
Twideem Civs twideem@outlook.com
{"password":"abc123"}
abc123

既然 PHP 內嵌於 HTML,那透過 JSON 格式,將資料產生出來給 JavaScript 用,哦耶!


CSV

讀取資料

diablo.csv

main.php


Necromancer 的等級是 89

fgetcsv() 在剖析雙位元組字串(如中文)時,會錯漏資料,例如 "1,王子麵,5" 剖析成 "1" 和 "王子麵,5" 兩筆資料,而不是 1、王子麵、5 三筆資料。解決辦法是在使用前呼叫 setlocale(LC_ALL, 'en_US.UTF-8')setlocale(LC_ALL, 'zh_TW.BIG5'),端看你檔案的字元編碼而定。

修改和寫入還有更好的讀取方式

diablo.csv

同上。

main.php


ID,CHARACTER,LV
1,Amazon,11
2,Necromancer,89
3,Barbarian,67
4,Sorceress,23
5,Paladin,45


偽 HEX 檔案


616263646566672068696a6b6c6d6e6f7020717273747576207778797a
abcdefg hijklmnop qrstuv wxyz
其實還是純文字文件,只是文字被編碼了。


將數值寫入檔案

fwrite() 或 fputs() 會將數值轉為字串再寫入檔案,就算 fopen() 第二個參數下了 'b' 也一樣。解法是用 pack() 將數值轉為 binary string 後再寫入~


NUL ? NUL
DC4 NUL
NUL STX NUL NUL

1024768
1366768
512


列出所有檔案和子目錄

做法一:使用 opendir()、readdir()、closedir()

做法二:使用 scandir()

做法三:使用 glob()


列出能設定的 php.ini 項目