PHP 字符串:Heredoc
在 PHP 中除了使用单引号(')或者双引号(")表示字符串是否还有其他的方式呢?有的,在 PHP 中表示字符串还可以使用 Heredoc 结构或者 Nowdoc 结构。本 wiki 主要介绍 Heredoc。
基础知识
语法结构
Heredoc 的语法结构是:
<<< 标识符
// 字符串 String
标识符
标识符的命名
标识符的命名也要像其它标签一样遵守 PHP 的规则:只能包含字母、数字和下划线,并且必须以字母和下划线作为开头。
相关性质
- 结束标识符这一行只能包含标识符和分号(;);
- 结束标识符的前面必须是个被本地操作系统认可的换行,比如在 UNIX 和 Mac OS X 系统中是
\n
,而结束定界符(可能其后还有个分号)之后也必须紧跟一个换行,绝对不能包含其它字符。这意味着标识符不能缩进,分号的前后也不能有任何空白或制表符; - 如果不遵守 1 和 2 规则会导致 PHP 找不到结束标识符,在最后一行产生一个解析错误;
- Heredoc 结构不能用来初始化类的属性。自 PHP 5.3 起,此限制仅对 Heredoc 包含变量时有效;
- Heredoc 结构相当于双引号字符串,这就是说在 Heredoc 结构中单引号不用被转义,并且支持解析的转义字符和双引号相同;
- 由 5 可知位于开始标识和结束标识之间的变量可以被正常解析,但是不支持函数解析;
- 标识符可以自定义,一般教科书出现的有 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!" }