首先,问一个问题,PHP 中有几种创建字符串的形式,以及它们的区别是什么呢 ?
我自己问完这个问题的时候,顿时愣了一下,我只记得有三种,不知道还会不会出现第四种? 第五种?
-
使用双引号引起来的字符串。称之为 「双引号字符串」
比如
"你好,\r\n世界,'"
如果需要包含双引号,则双引号需要转义
"你好,\r\n世界,你好,\"简单教程\"'"
-
使用单引号引起来的字符串。称之为 「单引号字符串」
比如
'你好,\r\n世界,\''
如果需要包含单引号,则单引号需要转义
"你好,\r\n世界,你好,\'简单教程\'\'"
单引号字符串和双引号字符串之间的区别,就是双引号字符串会自动转义 「转义字符」,而单引号字符串则不会
例如下面的代码
<?php echo "你好,\r\n世界,'"; echo "你好,世界,\r\n你好,\"简单教程\"'"; echo "\n======\n"; echo '你好,\r\n世界,\''; echo '你好,\r\n世界,你好,\'简单教程\'\''; echo "\n";
输出结果如下
你好, 世界,'你好,世界, 你好,"简单教程"' ====== 你好,\r\n世界,'你好,\r\n世界,你好,'简单教程''
从输出结果中可以看出: 双引号字符串会自动转义转义字符,但单引号字符串则不会。
单引号字符串和双引号字符串能够满足大部分的需求,但是,它们也有一个缺点,就是无法理解的输出结果。
例如下面的代码
<?php echo "你好,\r\n 世界,' "; echo '你好,世界, \r\n你好'; echo "\n";
输出结果如下
你好, 世界,' 你好,世界, \r\n你好
注意: 不要轻易跨行的单引号字符串和双引号字符串,除非你自己自己想要的是什么
heredoc 和 nowdoc
第三种字符串,就是 heredoc 和 nowdoc。
那要怎么理解 nowdoc 和 heredoc 呢?
我给大家简化了下了,直接就是 所见即所得
这句话什么意思呢?比如下面这段文字
我们要如何完整的输出呢,包括 单引号、双引号、换行、前置空格、后置功能
使用单引号肯定不行,因为不会转转义字符,而使用双引号一般是可以的,但如果包含了双引号,则需要手动添加转义。
如果内容少,还说的过去,但内容一多,就不好办了,总不能一个一个转义吧。
这时候 nowdoc 和 heredoc 就派上用场了。
heredoc 和 nowdoc 的作用就一句话: 你看到的是什么,输出的就是什么
heredoc 和 nowdoc 语法
heredoc 字符串就象是没有使用双引号的双引号字符串,这就是说在 heredoc 字符串中单引号不用被转义。
heredoc 字符串中的变量将被替换,但在 heredoc 结构中含有复杂的变量时要格外小心。
heredoc 字符串有以下几个特征
- 开始标记和结束标记使用相同的字符串,通常以大写字母来写,常用的有
EOT
、EOD
、EOF
- 开始标记后不能出现空格或多余的字符。
- 结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号。
- 位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。在heredoc中,变量不需要用连接符.或,来拼接。
- 会自动解析转义字符。
也就是说,一般的语法格式如下
<?php $name= <<<EOF Hello \r\n World END; echo $name,"\n";
输出结果如下
Hello World
因此,上面的需求,我们可以使用下面的语法
<?php echo <<<EOT "你好,\r\n 世界,' "; '你好,世界, \r\n你好'; ---- EOT;
输出结果如下
"你好, 世界,' "; '你好,世界, 你好'; ----
可以看到,几乎完美的实现了我们的需求。
nowdoc 语法
nowdoc 字符串语法和 heredoc 的写法差不多,唯一的区别是必须在结束标识符要用单引号括起来
例如上面的范例,使用 nowdoc 语法,则代码如下
<?php echo <<<"EOT" "你好,\r\n 世界,' "; '你好,世界, \r\n你好'; ---- EOT;
引号可以是单引号,也可以是双引号
nowdoc 和 heredoc 自动解析变量
nowdoc 和 heredoc 可以包含变量,会自动识别变量和解析变量
例如下面的代码
<?php $name = "yufei"; $site = "简单教程"; echo <<<EOT Hello ${name}, Hello {$site}\n EOT;
运行结果如下
Hello yufei, Hello 简单教程