PHP中字符串的heredoc结构和nowdoc结构

最近在维护一个古老的PHP网站,没有前后台的分离,代码看起来很吃力,上面大段大段的HTML输出。在看的时候发现很多地方用了「<<<」这样的符号来标记字符串,好像之前学习PHP的时候,只讲了单双引号两种表示字符串的方式。今天偶然在书上看到了,这种「<<<」表示字符串的方式是heredoc和nowdoc结构。

echo <<<EOT
   <html>
   <head><title>主页</title></head>
   <body>主页内容</body>
   </html>
EOT;

一般来说,如果一段字符串里面有引号的话,我们会使用「\”」来进行转义,PHP中单引号和双引号都可以表示字符串,因此也可以使用单引号表示字符串的开始和结束。

echo '这里的"双引号"不用转义';

在HTML里面,标签的属性也使用了xxx=”yyy”的方式来表示。

<divid="div-id"class="div-class"></div>

在输出大段HTML的时候,对所有双引号进行转义的工作量太大,而且对于维护不是很方便,经常出现引号没对齐的错误。通常我们会使用单引号来表示这种大段的里面有双引号的字符串。

不过HTML里面,也是允许单引号表示属性的。如果在输出的HTML里面存在单双引号混用的情况,传统的单双引号字符串会比较麻烦,因此我们使用了heredoc模式来表示字符串。

echo<<<EOT
   <div id="div-id"class="div-class">$content</div>
EOT;

如图所示,heredoc模式相当于另外定义了一个字符串结束标记EOT,在「<<<EOT」和「EOT」之间的单双引号,都不会被当成字符串开始和结束标记。这对于我们格式化输出内容是很有用的。

heredoc的使用具有如下特点:

1、开始标记和结束标记使用相同的字符串,通常以大写字母来写。

2、开始标记后不能出现空格或多余的字符。

3、结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号 。

4、位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。在heredoc中,变量不需要用连接符「.」或「,」来拼接 。

在PHP5.3.0及其以后的版本中增加了nowdoc结构,其用法和heredoc相同,不同的是nowdoc类似于单引号,不会解析开始标记和结束标记之间的变量,这种结构很适合用于嵌入 PHP 代码或其它大段文本而无需对其中的特殊字符进行转义。

同样的之前的例子用nowdoc结构可以表示为:

echo<<<'EOT'
   <div id="div-id"class="div-class">$content</div>
EOT;

和heredoc结构用法唯一的区别就是开始标记用引号包起来,这里的$content会被原样输出而不会被解析成变量的值。

在使用heredoc和nowdoc结构的时候,经常会遇到如下的报错:

Parse error: syntax error, unexpected T_SL in php

一般产生这种问题的原因是定界符之后有空格引起的,例如上面的EOT后面有空格就会报这个错误。处理是否有空格还有一个小技巧,就是利用编辑器的代码提示功能,以我用的notepad++为例。

正常的代码里面,整个heredoc结构字符串都是灰色的。

搬运自我的技术博客:http://www.cc-lab.cn/heredocandnowdoc/

时间: 2024-08-25 07:29:21

PHP中字符串的heredoc结构和nowdoc结构的相关文章

c语言中字符串操作的工具类

 1.编写头文件 #define _CRT_SECURE_NO_WARNINGS //#pragmawarning(disable:4996) #include <stdio.h> #include <stdlib.h> #include <string.h> struct CString { char *p;        //保存字符串首地址 int reallength; //实际长度 }; typedef struct CString mystring;//

Lua中字符串类型的源码实现

    概述 Lua完全采用8位编码,Lua字符串中的字符可以具有任何数值编码,包括数值0.也就是说,可以将任意二进制数据存储到一个字符串中.Lua的字符串是不可变的值(immutable values).如果修改,实质上是新建一个字符串.根据上文<Lua中数据类型的源码实现>中知道,在Lua中,字符串是自动内存管理机制所管理的对象,并且由联合体TString来实现存储字符串值的.下面将通过Lua 5.2.1的源码来看字符串的实现以及总结了在Lua中使用字符串的注意事项.     源码实现 首

java中字符串比较==和equals

1 总体来说java中字符串的比较是==比较引用,equals 比较值的做法.(equals 对于其他引用类型比较的是地址,这是因为object的equals方法比较的是引用),但是不同的声明方法字符串的比较结果也是不同的.    例如:  String str1=new String("a");        String str2=new String("a");        str1==str2  输出false        str1.equals(str

JS基础-----JS中的分支结构及循环结构

[分支结构] 一.if-else结构 1.结构的写法:if(判断条件){ //条件为true时,执行if的{} }else{ //条件为false时,执行else的{} } 2.注意事项 ①else语句块.可以根据情况进行省略. ②if和else后面的{}可以省略,但是省略{}后,if和else后面只能跟一条语句.(所以并不建议省略{}) 3.if的()中的判断条件,支持的情况: ①Boolean:true为真,false为假: ②String:空字符串为假,所有非空字符串为真: ③Number

Java内存管理-探索Java中字符串String(十二)

做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 一.初识String类 首先JDK API的介绍: public final class String extends Object implements Serializable, Comparable<String>, CharSequence String类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 字符串是常量:它们的值在创建之后不能更改.字符

Python中字符串格式化如何实现?

Python开发中字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存. This PEP proposes a new system for built-in string formatting operations, intended as a replacement for the existing '%' string formatting operator. 1.百分号方式 %[(na

python中字符串链接的七种方式

一. str1+str2 string类型 '+'号连接 >>> str1="one" >>> str2="two" >>> str1+str2 'onetwo' >>>注意:该方式性能较差,因为python中字符串是不可变的类型,使用 + 连接两个字符串时会生成一个新的字符串,生成新的字符串就需要重新申请内存,当连续相加的字符串很多时(a+b+c+d+e+f+...) ,效率低下就是必然的了例

Hibernate中,基于Annotation的简单树形结构的实现

在系统设计中,经常用到递归性质的树形结果,比如菜单.多级分类等,一般是在同一个表中定义父子关系实现这种结构. 下面是在Hibernate中,基于Annotation的简单树形结构的实现: 第一步:创建Entity类,并添加注解实现关联关系    ps: 主要是利用@ManyToOne 和 @OneToMany 配置在同一个Entity类中实现树形递归的结构.hibernate注解形式比在xml配置更加简洁 TreeNode.java 1 package com.hfut.hibernate; 2

Python中字符串查找效率比较

Python中字符串查找方式有多种,常见的有re.match/search or str.find 用一个例子来说明各种方式的效率如下: from timeit import timeit import re def find(string, text): if string.find(text) > -1: pass def re_find(string, text): if re.match(text, string): pass def best_find(string, text): i