马黑黑 发表于 2025-4-10 18:41

PHP定界符:HEREDOC和NOWDOC

本帖最后由 马黑黑 于 2025-4-10 21:26 编辑

HEREDOC较早出现,它用于充当定界符号,以使多行文本可以连贯书写,不必老用 echo 或 print 去写HTML代码,非常方便。更主要的,HEREDOC 定界符可以可以解析包含PHP变量在内的内容,确保由它包裹的多行文本可以正常执行而不会出错,这得益于它封装了转义引号、PHP变量符号 $ 等等特殊字符;而要使用传统的 echo 和 print,我们需要另外转义,比较繁琐。


过去,HEREDOC 只有一种写法:

<<<EOF
    // 这里是多行文本(可以是HTML、CSS、JS甚至PHP代码
EOF;

现在的PHP版本,支持这么写:

<<<“EOF”
    // 这里是多行文本(可以是HTML、CSS、JS甚至PHP代码
EOF;

就是说,EOF 可以加小角双引号。

而加小角单引号的,是 NOWDOC 定界符,试看:

<<<'EOF'
    // 这里是多行文本(可以是HTML、CSS、JS甚至PHP代码
EOF;

与 HEREDOC 定界符不同,NOWDOC 定界符里面的文本(代码),PHP变量不会被解析,PHP语句也不会被执行,但CSS、HTML、JS正常执行。

看下面两组代码:


<?php
/*heredoc 定界符
   $name 变量会被PHP解析
*/

$name = 'Jack';

$mystr = <<<EOF
<style>
      .tRed { color: red; }
      .tBlue { color: blue; }
</style>

<div class="tRed">{$name}'s been back.</div>
<div class="tBlue">And he says Kate's going to be back soon.</div>
EOF;

echo $mystr;

/*输出:
Jack's been back.
And he says Kate's going to be back soon.
*/
?>



<?php
/*nowdoc 定界符
   $name 变量不会被PHP解析
*/

$name = 'Jack';

$mystr = <<<'EOF'
<style>
      .tRed { color: red; }
      .tBlue { color: blue; }
</style>

<div class="tRed">{$name}'s been back.</div>
<div class="tBlue">And he says Kate's going to be back soon.</div>
EOF;

echo $mystr;

/*输出:
{$name}'s been back.
And he says Kate's going to be back soon.
*/
?>


定界符规定:

由 <<< 引导,紧跟着加关键词,关键词可以自定义,一般使用大写字母,例如本文示例的 EOF,和前导符号一起写成 <<<EOF,二者间不能有空格,EOF 之后也不能有空格或其它任何字符;多行文本之后另起一行,顶格书写收尾符 EOF(收尾符和起始符要相一致),必须紧跟着小角分好 ; ,写成 EOF;,小角分号之后不能有任何包含空格在内的任何字符。此外,如果想在多行文本显示符号 <<<,需要额外转义,可以写成 \<<< 。

PHP定界符和HTML标签 pre 在格式上有一丝丝类似,就是它们包裹的内容会“原本”输出——当然不是真正的原本。

红影 发表于 2025-4-10 21:05

“与 HEREDOC 定界符不同,NOWDOC 定界符里面的文本(代码),PHP变量不会被解析”
知道了两者的区别,看到“加小角单引号的,是 NOWDOC 定界符”
可是在下面的两组代码里,看着是一样的啊,并没加小角单引号啊?{:4_203:}

红影 发表于 2025-4-10 21:06

这个内容看着很难,努力去理解也没理解明白{:4_173:}

马黑黑 发表于 2025-4-10 21:24

红影 发表于 2025-4-10 21:05
“与 HEREDOC 定界符不同,NOWDOC 定界符里面的文本(代码),PHP变量不会被解析”
知道了两者的区别,看 ...
加小引号是指定界符的起始关键词:

<<<EOF
    //多行文本
EOF;

<<<'EOF'
    //多行文本
EOF;

马黑黑 发表于 2025-4-10 21:25

红影 发表于 2025-4-10 21:06
这个内容看着很难,努力去理解也没理解明白

PHP是后端语言,跑在服务器上。这个论坛 discuz! 就是用 PHP 编写的

红影 发表于 2025-4-10 22:12

马黑黑 发表于 2025-4-10 21:24
加小引号是指定界符的起始关键词:

嗯嗯,现在看到了,的确多了小引号{:4_187:}

红影 发表于 2025-4-10 22:13

马黑黑 发表于 2025-4-10 21:25
PHP是后端语言,跑在服务器上。这个论坛 discuz! 就是用 PHP 编写的

哦,我只会玩,对它还真不了解呢{:4_173:}

马黑黑 发表于 2025-4-10 22:22

红影 发表于 2025-4-10 22:13
哦,我只会玩,对它还真不了解呢

论坛就是PHP支撑的。上世纪,PHP门槛高,大家用的是ASP,像那个曾经风行一时的动网论坛就是,它发帖前有预览功能呢,不过现在ASP基本沉寂了。

PHP是老牌后端语言,现在的新秀 Python 也很出色,不过目前还无法叫板PHP。

马黑黑 发表于 2025-4-10 22:23

红影 发表于 2025-4-10 22:12
嗯嗯,现在看到了,的确多了小引号

之前应该是我忘记添上了{:4_170:}

红影 发表于 2025-4-10 22:31

马黑黑 发表于 2025-4-10 22:22
论坛就是PHP支撑的。上世纪,PHP门槛高,大家用的是ASP,像那个曾经风行一时的动网论坛就是,它发帖前有 ...

我都不知道什么是前端后端,去搜了一下:前端主要负责用户界面的设计和实现,包括HTML、CSS、JavaScript等技术。而后端则负责服务器端的逻辑处理、数据存储以及与数据库的交互等。
PHP在后端开发中的优势不言而喻。首先,它拥有强大的数据库处理能力,能够与MySQL、PostgreSQL等多种数据库无缝对接,实现数据的存储、检索和操作。其次,PHP的面向对象编程特性使得代码更加模块化和可维护。此外,PHP还提供了丰富的内置函数和库。

红影 发表于 2025-4-10 22:32

马黑黑 发表于 2025-4-10 22:23
之前应该是我忘记添上了

没事,我主要想证明 我是认真看了的,虽然没看懂,但态度要好啊{:4_173:}

马黑黑 发表于 2025-4-10 23:08

红影 发表于 2025-4-10 22:32
没事,我主要想证明 我是认真看了的,虽然没看懂,但态度要好啊

{:4_172:}

马黑黑 发表于 2025-4-10 23:11

红影 发表于 2025-4-10 22:31
我都不知道什么是前端后端,去搜了一下:前端主要负责用户界面的设计和实现,包括HTML、CSS、JavaScript ...

PHP也是一门高级语言,内置变量、函数、语句等和JS一样,基本都是语义化的。

和 JS 一样,PHP 也有明显的 C 语言特征。我是先会 PHP,后会 JS 。学习PHP绕不开 JS,好在它们很相近,学习 JS 基本上就是过目一遍文档,然后用到哪儿再深入研习一下下。

梦江南 发表于 2025-4-11 08:00

谢谢老师辛苦,学习了。{:4_190:}

花飞飞 发表于 2025-4-11 17:27

看到这个PHP标题就想到了整站系统。。
这个是回归老本行啦。。
我来看看说些什么。。{:4_174:}

花飞飞 发表于 2025-4-11 17:42

现在的PHP版本,支持EOF 可以加小角双引号。
下面的第一个例子中有新的不用哎。。你也没加小角双引号啊,还是过去的写法。{:4_173:}
这个双引号加和不加效果一样的吧。反正变量会被解析。。

花飞飞 发表于 2025-4-11 17:44

其实我更关心的是它能不能解析\n。为啥明明有它不识别成换行符让我手工换行。{:4_205:}

红影 发表于 2025-4-11 20:44

马黑黑 发表于 2025-4-10 23:08


笑什么啊,我在努力中啊{:4_203:}

马黑黑 发表于 2025-4-11 20:45

红影 发表于 2025-4-11 20:44
笑什么啊,我在努力中啊

{:4_190:}

红影 发表于 2025-4-11 20:46

马黑黑 发表于 2025-4-10 23:11
PHP也是一门高级语言,内置变量、函数、语句等和JS一样,基本都是语义化的。

和 JS 一样,PHP 也有明 ...

原来学这个还要学习js,我对js还是有点敬而远之的{:4_173:}
页: [1] 2 3
查看完整版本: PHP定界符:HEREDOC和NOWDOC