PHP 字符串:Heredoc 5 个改进

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

基础知识

语法结构

Heredoc 的语法结构是:

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

标识符的命名

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

相关性质

  1. 结束标识符这一行只能包含标识符和分号(;);
  2. 结束标识符的前面必须是个被本地操作系统认可的换行,比如在 UNIX 和 Mac OS X 系统中是\n,而结束定界符(可能其后还有个分号)之后也必须紧跟一个换行,绝对不能包含其它字符。这意味着标识符不能缩进,分号的前后也不能有任何空白或制表符
  3. 如果不遵守 1 和 2 规则会导致 PHP 找不到结束标识符,在最后一行产生一个解析错误;
  4. Heredoc 结构不能用来初始化类的属性。自 PHP 5.3 起,此限制仅对 Heredoc 包含变量时有效;
  5. Heredoc 结构相当于双引号字符串,这就是说在 Heredoc 结构中单引号不用被转义,并且支持解析的转义字符和双引号相同;
  6. 由 5 可知位于开始标识和结束标识之间的变量可以被正常解析,但是不支持函数解析
  7. 标识符可以自定义,一般教科书出现的有 EOT,EOD,EOF 等, 只要保持开始标识和结束标识一致即可。

拓展

使用示例

例 1 —— 错误的语法结构
<?php
class Foo {
    public $test = <<<EOF
Hello world !
    EOF; //标识符前面出现了制表符,不符合上述性质 2
}

例 1 结果:

Parse error: syntax error, unexpected end of file, expecting variable (T_VARIABLE) or heredoc end (T_END_HEREDOC) or ${ (T_DOLLAR_OPEN_CURLY_BRACES) or {$ (T_CURLY_OPEN) in F:\php\example.php on line 6

结果分析:

  • 由于结束标识行出现了其他字符,所以会产生一个解析错误。
例 2 —— 一般使用
<?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

例 2 结果:

我的名字叫 "John",我的工作是 软件工程师 。 现在, 我正在奋力敲着代码 Hello world ! 转义 'A': A

结果分析:

  • Heredoc 可以解析变量名和特殊字符;
  • 可以用于编写一个输出模板,实现界面与代码的准分离。
例 3 —— 在参数中使用
<?php
var_dump(array(<<<EOD
    Hello world!
EOD
));

例 3 结果:

array(1) { [0]=> string(12) "Hello world!" }

参考

本文为 Wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!