## 字符串(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防御