PHP 教學 - 資料型態 (Data Type) - 下
介紹 PHP 中的資料型態 (型別),包含字串 (String)、陣列 (Array)、物件 (Object)、資源 (Resource)、NULL,型別的判斷與轉型。
字串 (String)
語法
字串有四種使用的方式:
- 單引號
- 雙引號
- Heredoc
- Nowdoc
以下逐一進行介紹。
單引號
以兩個單引號包夾一段文字,表示字串內容,使用單引號的字串有一些特徵如下 (與雙引號比較):
- 逸出字元 (Escape characters) 只有兩種。
- 逸出字元
\\
可省略寫作\
,但不可為最後一個字元 (不建議省略)。 - 不會對字串中的變數進行解析。
所謂逸出字元是為了某些特別的用途或能以此輸入打不出來的字,而定義的一種使用方式,在此的逸出字元以反斜線 (backslash) 開頭。例如,我們使用單引號做包夾,但字串中如果出現單引號,將會誤判為字串結束單引號,所以使用 \'
來表示字串中的單引號。使用單引號的字串可用的逸出字元如下:
符號 | 說明 |
---|---|
' | 單引號字元。 |
\ | 反斜線字元。 |
一些使用範例如下:
1 | echo '基本用法'; |
雙引號
以兩個雙引號包夾一段文字,表示字串內容,最主要的重點是,變數會在雙引號中被解析。雙引號的逸出字元如下:
符號 | 說明 |
---|---|
\n | 換行字元(LF or 0x0A)。 |
\r | 歸位字元(CR or 0x0D)。 |
\t | 水平Tab字元(HT or 0x09)。 |
\v | 垂直tab字元(VT or 0x0B, PHP 5.2.5之後加入)。 |
\f | 跳頁字元(CR or 0x0C, PHP 5.2.5之後加入)。 |
\ | 反斜線字元。 |
$ | 錢號字元。 |
" | 雙引號字元。 |
[0-7]{1,3} | 以八進位法表示字元。 |
\x[0-9A-Fa-f]{1,2} | 以十六進位法表示字元。 |
一些使用範例如下:
1 | echo "\"You're a good man.\" she said."; // "You're a good man." she said. |
Heredoc
Heredoc使用 <<<
符號開始,後面接著一個自訂的標籤,最後以自訂的標籤作結束。
1 | $text="hello"; |
結果:
1 | Yahoo |
Heredoc 與雙引號性質相似,除了 Heredoc 的雙引號視為一般字元不需使用逸出字元。
Nowdoc
在 PHP 5.3.0 之後新增 Nowdoc 用法,Nowdoc 使用 <<<
符號開始,後面接著一個使用單引號包夾的自訂標籤,最後以自訂的標籤作結束。
1 | $text = "hello"; |
Nowdoc 無法使用逸出字元,也不會解析變數,也就是純文字的內容。另外 PHP 5.3.0 之後,相對於 Nowdoc 的單引號,Heredoc 同時新增了使用雙引號包夾的用法。
變數解析
字串中可放入變數直接進行解析,在字串中使用變數的寫法有三種,假設有一變數 $var
:
- 直接使用:
"$var"
- 使用大括號一:
"${var}"
- 使用大括號二:
"{$var}"
某些情況下直接使用可能會不如預期,如下範例:
1 | $beer = 'Heineken'; |
所以建議使用大括號的方式為佳,使用陣列或物件的變數的時候也常會有問題:
1 | $teletubbies = array('dindin' => '紫色', 'lala' => '黃色'); |
字串的操作
字元的存取修改
字串可簡單視為字元的陣列,可以用陣列的索引方式取得或修改某個字元,但並不能真的完全當作陣列使用。用法範例如下:
1 | $str = "I lose"; |
字串的連接
PHP中,字串使用點 (.
) 來作為連接運算子,而不是使用加號 (+
),如果使用加號的話,會自動將字串轉型為數字做運算。
1 | $hello = "Hello"; |
轉型
要轉型為整數可利用以下方式
- 利用
(string)
的強制轉型。 - 利用
strval()
函式轉型。 - 利用
settype()
傳入引數"string"
。
1 | var_dump((string) false); // string(0) "", 注意 false 為空字串 |
在 PHP 5 之後的物件必須要實作 __toString()
的函式才能轉為字串,否則會出錯。
常見問題
常數誤用
在 PHP 中,變數使用錢號做開頭,而常數則無錢號,也因此造成許多情況下,未知的字詞就被視為常數處理,但若又無此常數,就會視為字串使用 (如變數解析中出現的情況)。
1 | $text = Hello; // 無 Hello 常數, 視為字串 |
字串比較
如果直接拿兩個字串來比較的話,程式的邏輯上預設是逐字以字母順序來作比較,例如 b 大於 a 和 ab 大於 aab (比對到第二個字元 b > a),但在 PHP 中,他會先判斷兩者是否為數字內容 (is_numeric
為 true
),如果是的話就轉成數字比較:
1 | var_dump('1.22' > '01.23'); // bool(false), 兩者皆為數字, 轉為數字比較 |
空字串修改
字元的存取修改中提到,以陣列方式去修改超出長度的字元時,會自動填入空白至該位置,但是當變數為空字串時為例外情況,他會被轉為陣列。
1 | $str = ""; |
陣列 (Array)
PHP 中的陣列是有順序性的 Map 資料結構,所以他不只可以作為一般的陣列使用外,搭配相關函式還可以將他作為各種資料結構使用,例如:Stack, Queue, Hashtable…等
語法
在 PHP 中,使用 array()
來建立陣列,括號中使用 Key => Value 的鍵與值或 Value 來建立陣列元素,以逗號隔開元素,其中 Key 可為整數或字串:
1 | array( key => value |
一些範例如下:
1 | var_dump(array(178, 169.99, "30cm", array(9527))); |
陣列中的元素也可以是陣列,而成為多維陣列的應用。另外,print_r()
函式與 var_dump()
類似,也可將變數內容顯示出來,但較為簡潔,以下部分改使用 print_r()
來呈現。
陣列存取
我們使用中括號 ([]
) 加上 Key 來表示陣列中的元素,例如:$array['Key']
,以此方式可以取得或修改陣列元素的內容,要清除陣列元素則用 unset()
函式。以下為存取陣列的相關範例:
1 | $ar = array(); |
轉型
要轉型為陣列可利用以下方式
- 利用
(array)
的強制轉型。 - 利用
settype()
傳入引數"array"
。
將其他型別轉為陣列型別通常的行為是產生一個陣列,索引值 0 的位置為原型別內容,但 NULL 和 object 型別則例外,object 型別轉換的規則如下:
- 只轉換變數成員,函式成員不被轉換。
public
成員以[成員名稱]
為陣列 Key 值。protected
成員以[*成員名稱]
為陣列 Key 值。private
成員以[\0類別名稱\0成員名稱]
為陣列 Key 值。
1 | var_dump((array) true); // array(1) { [0]=> bool(true) } |
物件(Object)
語法
物件使用 new
關鍵字來建立,物件一般由類別 (Class) 來定義內容,也可以使用基本的物件類別 stdClass
,使用範例如下:
1 | class A { |
物件存取
如上面範例所示,物件使用 ->
符號來叫用或存取成員。要注意的地方是,如果將物件指派給其他變數,他是以傳址 (Pass by reference) 的方式指派,而不是傳值 (Pass by value) 的方式複製一份,如果要進行複製,則可使用 clone
關鍵字,但是物件下的物件並不會遞迴複製。
1 | $obj = new stdClass; |
轉型
要轉型為物件可利用以下方式
- 利用
(object)
的強制轉型。 - 利用
settype()
傳入引數"object"
。
將其他型別轉為物件型別通常的行為是產生一個 stdClass
物件,成員 scalar
為原型別內容,但 NULL 和 array 型別則例外,array 型別會將陣列中的 Key => Value 轉成物件成員:
1 | var_dump((object) false); // object(stdClass)#1 (1) { ["scalar"]=> bool(false) } |
資源 (Resource)
資源是特別的型別,為來自外部的資源參考,例如檔案串流等。由於轉型為資源並不具意義,故無法轉型為資源型別。資源的用法依據所使用的類別而定,故需各別參考該資源相關文件。
空值 (NULL)
語法
空值的值只有 NULL 一種內容,不分大小寫。
1 | $a = NuLl; |
轉型
轉型為空值並沒有特別的意義,但仍可利用以下方式
- 利用
(unset)
的強制轉型。 - 利用
settype()
傳入引數"null"
轉型。( 為 PHP 4.2.0 之後新增 ) - 利用
unset()
函式,注意這是將變數完全移除。
1 | $ar = array(55, 66, 77, 88); |
虛擬型別
這部份的型別在文件中使用到,並非實際的型別。
混合 (Mixed)
混合型別在文件表示可以是多種的型別,但不一定是所有型別。例如 str_replace()
函式在文件中紀錄如下:
1 | mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] ) |
回傳為 mixed 的型別只有 string 或 array 兩種。
數字 (Number)
數字型別表示可以是整數型別或浮點數型別。
回呼 (Callback)
Callback 型別表示某個函式的名稱,實際上傳入的型別是字串,不過在文件中對此用途特別稱為 Callback。
延伸閱讀
上一篇 PHP 教學 - 資料型態 (Data Type) - 上
下一篇 PHP 教學 - 變數 (Variables)