PHP 中的 heredoc 和 nowdoc 以及它们的区别

yufei       5 年, 4 月 前       1076

首先,问一个问题,PHP 中有几种创建字符串的形式,以及它们的区别是什么呢 ?

我自己问完这个问题的时候,顿时愣了一下,我只记得有三种,不知道还会不会出现第四种? 第五种?

  1. 使用双引号引起来的字符串。称之为 「双引号字符串」

    比如

    "你好,\r\n世界,'"
    

    如果需要包含双引号,则双引号需要转义

    "你好,\r\n世界,你好,\"简单教程\"'"
    
  2. 使用单引号引起来的字符串。称之为 「单引号字符串」

    比如

    '你好,\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 字符串有以下几个特征

  1. 开始标记和结束标记使用相同的字符串,通常以大写字母来写,常用的有 EOTEODEOF
  2. 开始标记后不能出现空格或多余的字符。
  3. 结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号。
  4. 位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。在heredoc中,变量不需要用连接符.或,来拼接。
  5. 会自动解析转义字符。

也就是说,一般的语法格式如下

<?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 简单教程
目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.