[TOC] #### 1. 什么是字符串 --- 字符串就是由连续的字母、数字或字符组成的字符序列(简单理解:字符串就是由一系列字符组成的数据) 这些字符可以是:文字、数字、符号、空格、Unicode 字符、特殊字符,例如: ```php $name = "张三"; $age = "18"; $url = "https://example.com"; $msg = "Hello World"; ``` #### 2. 字符串定界符 --- 在 PHP 中,字符串必须通过定界符(Delimiter)包裹起来,PHP 有四种字符串定界符: + 单引号 `' '` + 双引号 `" "` + Heredoc `<<<` + Nowdoc `<<<'标识符'` 不同的定界符在变量解析、转义规则、性能、使用场景上有区别 ##### 单引号 单引号是最简单的字符串定界方式,特点: + 不解析变量 + 不解析大多数转义字符,仅支持 `\\` 和 `\'` ```php $name = 'liang'; echo $name; // liang // 单引号定界符只能解析 `\\` 和 `\'` 两个转义字符 // 如果要在单引号定界符的字符串中使用单引号,需要使用 \ 转义,也就是 \' $name = 'li\'ang'; echo $name; // li'ang // 单引号不会解析变量,所以单引号的运行效率比双引号高 $name = 'liang'; $desc = 'my name is {$name}'; echo $desc; // my name is {$name} ``` ##### 双引号 双引号定界符可以解析变量和大多数转义字符 ```php // 解析变量 $name = 'liang'; $desc = "my name is {$name}"; echo $desc; // my name is liang // 转义字符 echo "\$World"; echo "Hello\nWorld"; ``` 双引号解析变量时,容易出现边界问题。[查看字符串中花括号 {} 详细用法](https://www.itqaq.com/index/298.html) ```php // 错误写法: $age = 18; echo "年龄:$age岁"; echo "年龄:$ageabc"; // 变量名后面跟一个空格,可以正常解析,但是不推荐这样写,容易有歧义 echo "年龄:$age abc"; // 推荐写法(在双引号中使用变量,优先使用 {} 包裹): echo "年龄:{$age}岁"; // 复杂变量 $user = ['name' => '张三', 'age' => 18]; echo "姓名:{$user['name']},年龄:{$user['age']}岁"; ``` ##### Heredoc 定界符 Heredoc 定界符用于定义多行文本,它可以解析变量,标识符使用双引号或不使用引号包裹(类似于双引号) + 特点:支持变量解析、支持换行、适合大量文本 ```php $name = "张三"; $html = <<<HTML <div> <h1>$name</h1> <p>不使用引号可以解析</p> </div> HTML; $html2 = <<<"HTML" <div> <h1>$name</h1> <p>使用双引号也可以解析</p> </div> HTML; echo $html; echo $html2; ``` 结束定界符必须: + 独占一行 + 前后不能有其他字符 ##### Nowdoc 定界符 Nowdoc 定界符类似于单引号,不解析变量、不解析转义字符,适合保存原始文本 ```php $name = "Tom"; $str = <<<'TEXT' Hello $name \n TEXT; echo $str; ``` #### 3. 四种定界符对比 --- PHP 中的四种定界符对比: | 特性 | 单引号 | 双引号 | Heredoc | Nowdoc | | ------------ | ------------ | ------------ | ------------ | ------------ | | 变量解析 | 不支持 | 支持 | 支持 | 不支持 | | 转义字符 | 仅支持 `\\` 和 `\'` | 支持 | 支持 | 不支持 | | 支持多行 | 不支持 | 不支持 | 支持 | 支持 | | 使用场景 | 普通文本 | 动态字符串 | 大段模版文本 | 原始文本 | 实际开发建议: 普通字符串优先单引号(可读性高、不做变量解析、开销略小) ```php echo 'Hello World'; ``` 变量拼接使用双引号 ```php $username = 'liang'; $user = ['name' => '张三']; $obj = new stdClass(); // 推荐 echo "用户名:{$username}"; // 不推荐 echo "用户名:" . $username; // 复杂变量一定要加 {} $obj->name = '李四'; echo "{$user['name']}"; echo "{$obj->name}"; ``` HTML 模板使用 Heredoc(适用于 SQL 语句、HTML/JSON 模板、邮件内容模板) ```php $html = <<<HTML <ul> <li>{$name}</li> </ul> HTML; ``` 原始内容使用 Nowdoc(例如:生成代码,不会误解析变量) ```php $code = <<<'PHP' <?php echo $name; PHP; ```