## 字符串(string)
一個字符串就是由一系列的字符組成,其中每個字符等同于一個字節。這意味著 PHP 只能支持 256 的字符集,因此不支持 unicode 。[詳見字符串類型詳解](http://php.net/manual/zh/language.types.string.php#language.types.string.details)
一個字符串可以用 4 種方式表達:
* 單引號
* 雙引號
* heredoc
* nowdoc
### 單引號
要表達一個單引號自身,需在它的前面加個反斜線(\)來轉義。要表達一個反斜線自身,則用兩個反斜線(\\)。其它任何方式的反斜線都會被當成反斜線本身:也就是說如果想使用其它轉義序列例如 \r 或者 \n,并不代表任何特殊含義,就單純是這兩個字符本身。
> **Note:** 不像雙引號和 heredoc 語法結構,在單引號字符串中的變量和特殊字符的轉義序列將不會被替換。
```
<?php
echo 'this is a simple string';
// 輸出: Arnold once said: "I'll be back"
echo 'Arnold once said: "I\'ll be back"';
// 輸出: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';
// 輸出: You deleted C:\*.*?
echo 'You deleted C:\*.*?';
// 輸出: This will not expand: \n a newline
echo 'This will not expand: \n a newline';
// 輸出: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>
```
### 雙引號
如果字符串是包圍在雙引號(")中, PHP 將對一些特殊的字符進行解析:
| 序列 | 含義 |
| --- | --- |
| \n | 換行 |
| \r | 回車 |
| \t | 水平制表符 |
| \v | 垂直制表符 |
| \e | Escape |
| \f | 換頁 |
| \\ | 反斜線 |
| \$ | 美元標記 |
| \" | 雙引號 |
**注意:** 用雙引號定義的字符串最重要的特征是變量會被解析
```
<?php
echo "hello world";
echo "hello world \r\n, today is hot.\r\n";
$name = 'kate green';
// 輸出:My name is kate green
echo "My name is $name";
// 輸出:My name is kate green
echo "My name is {$name}"; // 推薦這種方式
// 輸出:My name is $name
echo "My name is \$name";
?>
```
### heredoc
heredoc 句法結構:`<<<` 在該運算符之后要提供一個標識符,然后換行。接下來是字符串 string 本身,最后要用前面定義的標識符作為結束標志。
**注意:** 結束時所引用的標識符必須在該行的第一列
```
<?php
$str = <<<EOT
Example of string
spanning multiple lines
using heredoc syntax.
EOT;
?>
```
```
<?php
$name = 'kate green';
$age = 12;
$country = 'England';
$str = <<<EOT
My name is {$name},
I am {$age} years old,
I am from {$country}.
EOT;
?>
```
heredoc 結構就象是沒有使用雙引號的雙引號字符串,這就是說在 heredoc 結構中單引號不用被轉義,但是上文中列出的轉義序列還可以使用,變量將被替換。
### nowdoc
一個 nowdoc 結構也用和 heredocs 結構一樣的標記 `<<<`, 但是跟在后面的標識符要用單引號括起來。heredoc 結構的所有規則也同樣適用于 nowdoc 結構,尤其是結束標識符的規則。
```
<?php
$name = 'kate green';
$age = 12;
$country = 'England';
$str = <<<‘EOT’
My name is {$name},
I am {$age} years old,
I am from {$country}.
EOT;
?>
```
nowdoc 結構就象是沒有使用單引號的單引號字符串,這就是說在 nowdoc 結構中不會進行解析操作,特殊字符不會轉義,變量不會被替換。
### 轉換為字符型
一個值可以通過在其前面加上 (string) 或用 strval() 函數來轉變成字符串。在一個需要字符串的表達式中,會自動轉換為 string。
```
<?php
$str = (string) 12345;
var_dump($str); // string(5) "12345"
$str = (string) 123.45;
var_dump($str); // string(6) "123.45"
$bool = true;
var_dump((string) $bool); // string(1) "1"
$bool = false;
var_dump((string) $bool); // string(0) ""
?>
```
### 變量解析
當字符串用雙引號或 heredoc 結構定義時,其中的變量將會被解析。
```
<?php
$name = 'kate green';
echo "My name is {$name}";
$user = array('name' => 'kate green', 'age' => 12);
echo "My name is {$user['name']}, I am {$user['age']} years old.";
$user = new object();
$user->name = 'kate green';
$user->age = 12;
echo "My name is {$user->name}, I am {$user->age} years old.";
?>
```
### 字符串運算符
有兩個字符串運算符。第一個是連接運算符(“.”),它返回其左右參數連接后的字符串。第二個是連接賦值運算符(“.=”),它將右邊參數附加到左邊的參數之后。更多信息見賦值運算符。
```
<?php
$a = "Hello ";
$b = $a . "World!"; // now $b contains "Hello World!"
$a = "Hello ";
$a .= "World!"; // now $a contains "Hello World!"
?>
```
### 實用函數
PHP內置了非常豐富的字符函數,請參考:[字符串函數](http://php.net/manual/zh/ref.strings.php)
- 基本語法
- PHP標記
- 指令分隔符
- 從HTML中分離
- 注釋
- 數據類型
- 布爾值
- 整數
- 浮點數
- 字符串
- 數組
- 對象
- 資源
- 空值
- 變量
- 基礎
- 預定義變量
- 變量范圍
- 可變變量
- 常量
- 常量語法
- 魔術常量
- 運算符
- 算術運算符
- 賦值運算符
- 位運算符
- 比較運算符
- 遞增與遞減運算符
- 邏輯運算符
- 字符串運算符
- 數組運算符
- 類型運算符
- 流程控制
- if條件結構
- switch條件結構
- while循環結構
- do-while循環結構
- for循環結構
- foreach循環結構
- 包含文件
- 函數
- 自定義函數
- 可變函數
- 匿名函數
- 遞歸函數
- 類與對象
- 基本概念
- 屬性
- 方法
- 類常量
- 構造函數和析構函數
- 訪問控制
- 繼承
- 抽象類
- 接口
- Trait
- 重載
- 對象遍歷
- 魔術方法
- Final關鍵字
- 命名空間
- 自動加載
- 錯誤處理
- 錯誤顯示
- 錯誤日志
- 錯誤報告
- 自定義錯誤處理
- 異常處理
- 異常處理機制
- 擴展異常處理類
- 字符操作
- 數組操作
- 時間操作
- 表單操作
- GET提交
- POST提交
- 文件上傳
- 會話控制
- COOKIE操作
- SESSION操作
- 文件操作
- 文件屬性
- 讀取文件
- 寫入文件
- 文件管理
- 文件鎖
- 目錄處理
- 路徑處理
- 網絡操作
- HTTP協議
- Socket操作
- CURL操作
- PDO操作
- 介紹
- 連接管理
- 預處理語句
- 事務處理
- 錯誤處理
- 圖像操作
- 正則表達式
- 標準推薦
- 包管理器
- 設計模式
- 常用算法
- 安全防御
- XSS防御
- CSRF防御