PHP 字符串:Nowdoc 3 个改进

在 PHP 中除了使用单引号(')或者双引号(")表示字符串是否还有其他的方式呢?有的,在 PHP 中表示字符串还可以使用 Heredoc 结构或者 Nowdoc 结构。本 wiki 主要介绍 Nowdoc

基础知识#

语法结构#

Nowdoc 的语法结构是:

<<< ' 标识符 '
    // 字符串 String
标识符 

标识符的命名#

标识符的命名也要像其它标签一样遵守 PHP 的规则:只能包含字母、数字和下划线,并且必须以字母和下划线作为开头

相关性质#

  1. 结束标识符这一行只能包含标识符和分号(;);
  2. 结束标识符的前面必须是个被本地操作系统认可的换行,比如在 UNIX 和 Mac OS X 系统中是 \n,而结束定界符(可能其后还有个分号)之后也必须紧跟一个换行,绝对不能包含其它字符。这意味着标识符不能缩进,分号的前后也不能有任何空白或制表符
  3. 如果不遵守 1 和 2 规则会导致 PHP 找不到结束标识符,在最后一行产生一个解析错误;
  4. Nowdoc 结构相当于单引号字符串,不支持解析特殊字符和变量名;
  5. 标识符可以自定义,一般教科书出现的有 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 适用于嵌入无需解析操作的大段文本。

参考#

本文为 Wiki 文章,邀您参与纠错、纰漏和优化