您的位置:首页 > 编程语言 > PHP开发

php heredoc 与 nowdoc

2016-07-29 15:00 633 查看
php heredoc 与 nowdoc

heredoc 结构

heredoc 句法结构:<<<。在该运算符之后要提供一个标识符,然后换行。接下来是字符串本身,最后要用前面定义的标识符作为结束标志。

[php] view
plain copy

 





<?php  

$content = <<<FDIPZONE  

<html>  

<head>  

<title>test</title>  

</head>  

<body>  

<p><img src="http://www.csdn.net/css/logo.png"></p>  

<p><a href='http://blog.csdn.net/fdipzone'>blog</a></p>  

</body>  

</html>  

FDIPZONE;  

  

echo $content;  

?>  

heredoc 结构不能用来初始化类的属性。自 PHP 5.3 起,此限制仅对 heredoc 包含变量时有效。下例将会出错。

[php] view
plain copy

 





<?php  

class test{  

  

public $var = '123';  

  

public $a = <<<FDIPZONE  

$var  

FDIPZONE;  

  

}  

  

$obj = new test();  

echo $obj->a;  

?>  

heredoc结构中,变量将被替换,但方法不会。含有复杂的变量时要格外小心。

[php] view
plain copy

 





<?php  

$var = '123';  

$content = <<<FDIPZONE  

$var time();  

FDIPZONE;  

  

echo $content; // 123 time();  

?>  

nowdoc 结构

nowdoc 句法结构很象 heredoc 结构,但是 nowdoc 中不进行解析操作。这种结构很适合用于嵌入php代码或其它大段文本而无需对其中的特殊字符进行转义。

nowdoc 与 heredoc 结构一样的标记 <<<,但跟在后面的标识符必须用单引号括起来,即<<<'EOF'。 heredoc 结构的所有规则同样适用于nowdoc结构,尤其是结束标识符的规则。nowdoc是在php5.3之后才加入的。

[php] view
plain copy

 





<?php  

$var = '123';  

$content = <<<'FDIPZONE'  

$var time();  

FDIPZONE;  

  

echo $content; // $var time(); $var没有被替换  

?>  

nowdoc 结构可以用在任意的静态数据环境中,最典型的示例是用来初始化类的属性或常量。下例将不会出错,可以对比heredoc的例子。

[php] view
plain copy

 





<?php  

class test{  

  

public $a = <<<'FDIPZONE'  

$var  

FDIPZONE;  

  

}  

  

$obj = new test();  

echo $obj->a;  

?>  

转自:http://blog.csdn.net/fdipzone/article/details/24937669

Heredoc技术,在正规的PHP文档中和技术书籍中一般没有详细讲述,只是提到了这是一种Perl风格的字符串输出技术。但是现在的一些论坛程序,和 部分文章系统,都巧妙的使用heredoc技术,来部分的实现了界面与代码的准分离,phpwind模板就是一个典型的例子。 如下:

<?php
header("content-type:text/html;charset=utf-8");
$name = '浅水游';
print <<<EOT
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>Untitled Document</title>
</head>
<body>
12321;
Hello,$name!
</body>
</html>
EOT;
?>

1.以<<<End开始标记开始,以End结束标记结束,结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号 。开始标记和开始标记相同,比如常用大写的EOT、EOD、EOF来表示,但是不只限于那几个,只要保证开始标记和结束标记不在正文中出现即可。
2.位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。在heredoc中,变量不需要用连接符.或,来拼接,如下:
$v=2;
$a= <<<EOF
"abc"$v
"123"
EOF;
echo $a; //结果连同双引号一起输出:"abc"2 "123"
3.heredoc常用在输出包含大量HTML语法d文档的时候。比如:函数outputhtml()要输出HTML的主页。可以有两种写法。很明显第二种写法比较简单和易于阅读。
function outputhtml(){
echo "<html>";
echo "<head><title>主页</title></head>"; 
echo "<body>主页内容</body>";
echo "</html>;
}
function outputhtml()
{
echo <<<EOT
   <html>
   <head><title>主页</title></head>
   <body>主页内容</body>
   </html>
EOT;
}
outputhtml();

heredoc句法结构:<<<。在该提示符后面,要定义个标识符,然后是一个新行。接下来是字符串 本身,最后要用前面定义的标识符作为结束标志。 

结束时所引用的标识符必须在一行的开始位置, 而且,标识符的命名也要像其它标签一样遵守PHP的规则:只能包含字母、数字和下划线,并且不能用数字和下划线作为开头。 
要注意的是结束标识符这行除了 可能有一个分号(;)外,绝对不能包括其它字符。这意味着标识符不能缩进,分号的前后也不能有任何空白或tabs。更重要 的是结束标识符的前面必须是个被本地操作系统认可的新行标签,比如在UNIX和Mac OS X系统中是\n ,而结束标识符(可能有个分号)的后面也必 须跟个新行标签。 

如果不遵守该规则导致结束标签不“干净”,PHP将认为它不是结束标识符而继续寻找。如果在文件结束前也没有找到一个正确的结束标识符,PHP将会在最后一行产生一个句法错误。 

Heredocs结构不能用来初始化class,而从PHP 5.3以后,则该限制只能用在包含变量的情况下。 

Example #1 非法的示例

<?php
class foo {
    public $bar = <<<EOT
bar
EOT;
}
?> 
Heredoc结构就象是没有使用双引号的双引号字符串, 这就是说在heredoc结构中引号不用被替换,但是上文中列出的字符 (\n等)也可使用。 变量将被替换,但在heredoc结构中字符串表达复杂变量时,要格外小心。 

Example #2 Heredoc结构的字符串示例

<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;

/* 含有变量的更复杂示例 */
class foo
{
    var $foo;
    var $bar;

    function foo()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = 'MyName';

echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
?> 
以上例程会输出:

My name is "MyName". I am printing some Foo.
Now, I am printing some Bar2.
This should print a capital 'A': A也可以把Heredoc结构用在函数参数中来传输数据: 

Example #3 Heredoc结构在参数中的示例

<?php
var_dump(array(<<<EOD
foobar!
EOD
));
?> 
在PHP 5.3.0以后,也可以用Heredoc结构来初始化静态变量和类的属性和常量: 

Example #4 使用Heredoc结构来初始化静态值

<?php
// 静态变量
function foo()
{
    static $bar = <<<LABEL
Nothing in here...
LABEL;
}

// 类的常量、属性
class foo
{
    const BAR = <<<FOOBAR
Constant example
FOOBAR;

    public $baz = <<<FOOBAR
Property example
FOOBAR;
}
?> 
在PHP 5.3.0中还在Heredoc结构中用双引号来声明标志符: 

Example #5 在heredoc结构中使用双引号

<?php
echo <<<"FOOBAR"
Hello World!
FOOBAR;
?>            

定界符 
1.PHP定界符的作用就是按照原样,包括换行格式什么的,输出在其内部的东西;
2.在PHP定界符中的任何特殊字符都不需要转义;
3.PHP定界符中的PHP变量会被正常的用其值来替换。
这个可以用来保存大段的文本比较有用。

转自:http://blog.csdn.net/qdujunjie/article/details/41041297
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php heredoc nowdoc