PHP 字符串:Nowdoc
在 PHP 中除了使用单引号(')或者双引号(")表示字符串是否还有其他的方式呢?有的,在 PHP 中表示字符串还可以使用 Heredoc 结构或者 Nowdoc 结构。本 wiki 主要介绍 Nowdoc。
基础知识
语法结构
Nowdoc 的语法结构是:
<<< ' 标识符 '
// 字符串 String
标识符
标识符的命名
标识符的命名也要像其它标签一样遵守 PHP 的规则:只能包含字母、数字和下划线,并且必须以字母和下划线作为开头。
相关性质
- 结束标识符这一行只能包含标识符和分号(;);
- 结束标识符的前面必须是个被本地操作系统认可的换行,比如在 UNIX 和 Mac OS X 系统中是
\n
,而结束定界符(可能其后还有个分号)之后也必须紧跟一个换行,绝对不能包含其它字符。这意味着标识符不能缩进,分号的前后也不能有任何空白或制表符; - 如果不遵守 1 和 2 规则会导致 PHP 找不到结束标识符,在最后一行产生一个解析错误;
- Nowdoc 结构相当于单引号字符串,不支持解析特殊字符和变量名;
- 标识符可以自定义,一般教科书出现的有 EOT,EOD,EOF 等, 只要保持开始标识和结束标识一致即可。需要注意的是起始标识符需要使用单引号(')包含。
拓展
使用示例
例 1 —— 一般使用
<?php
$str = <<<'EOD'
这是一个句子,
这个句子有两行,
用 Heredoc 结构输出有多少行?
EOD;
/* 含有变量的更复杂示例 */
class Foo
{
var $foo;
var $bar;
public function __construct()
{
$this->foo = '软件工程师';
$this->bar = array('Hello', 'world', '!');
}
}
$foo = new Foo();
$name = 'John';
echo <<<'EOT'
我的名字叫 "$name",我的工作是 $foo->foo 。
现在, 我正在奋力敲着代码 {$foo->bar[0]} {$foo->bar[1]} {$foo->bar[2]}
转义 'A': \x41
EOT;
例 1 结果:
我的名字叫 "$name",我的工作是 $foo->foo 。 现在, 我正在奋力敲着代码 {$foo->bar[0]} {$foo->bar[1]} {$foo->bar[2]} 转义 'A': \\x41
从输出结果可以看出,PHP 在 Nowdoc 中不进行解析操作。因此,Nowdoc 适用于嵌入无需解析操作的大段文本。