php

php中heredoc模板引擎方法小结

dafenqi
2023-08-07 / 0 评论 / 10 阅读 / 正在检测是否收录...

php中heredoc模板引擎方法小结

Heredoc 技术,也叫字符串输出技术,在正规的PHP文档中和技术书籍中一般没有详细讲述,只是提到了这是一种Perl风格的字符串输出技术。之前在研究PW模板中经常发现,但一直不明白原理,其实这就是一种大量字符串输出的技术,这种技术不仅能大量输出字符串,而且还能实现了界面与代码的准分离,phpwind模板就是巧妙了使用这种技术,一个典型的例子!
举个简单的例子:

echo EOT<<<;
My name is Tom
EOT;
这样就输出一段span 可以看出里面照样可以使用双引号。也就是说在EOT<<<与EOT之间字符串可以按照HTML格式写,不需要转义,而且易于阅读。
既然有这么方便的东西,不是就可以当作模板吗?看下下面这个模板页面name.html

<!--<?php
$name = 'Tom';
print <<<EOT
-->



Untitled Document


Hello,$name!


<!--<?php
EOT;
?>-->

如果采用php页面include ‘name.html’;结果输出Hello,Tom;
而如果直接访问HTML;输出Hello,说明PHP部分被注释了。

但是使用heredoc要注意几点:

1.以<<<EOT开始标记开始,开始标记后面不能有空格,以EOT;结束标记结束,结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号。之前因为养成了良好的缩进情况,一直无法正常解析,百思不得其解。。开始标记和开始标记相同,比如常用大写的EOT、EOD、EOF来表示,但是不只限于那几个,只要保证开始标记和结束标记不在正文中出现即可。

2.位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。在heredoc中,变量不需要用连接符.或,来拼接,如果是数组需使用{}:如’Hi’$name, {$arrSet['name']}。


Heredoc技术,在正规的PHP文档中和技术书籍中一般没有详细讲述,只是提到了这是一种Perl风格的字符串输出技术。但是现在的一些论坛程序,和部分文章系统,都巧妙的使用heredoc技术,来部分的实现了界面与代码的准分离,phpwind就是一个典型的例子。
在PHP的文档中,只是提到了echo可以使用如下命令输出多行字符串(而且其中的变量被自动替换):
PHP如下:
echo <<<END
This uses the "here document" syntax to output
multiple lines with $variable interpolation. Note
that the here document terminator must appear on a
line with just a semicolon. no extra whitespace!
END;
上面的END结束符可以自己规定,在Phpwind,使用了“EOT”来结束。但是需要注意的是,这个END必须是在一行的开头才能有效,这其实是Heredoc技术的一个局限性(因为heredoc可以自定义结束符,所以引入了这个问题),在下面会提到。
phpwind的模板文件一般存放在templatewind目录下面,在BBS目录中,使用require语句包含这个模板文件。其实这个模板文件是作为对应的PHP文件的一部分执行的,所以就不需要像PHPLib Template那样需要进行模板解析,然后再执行的过程。
为了让heredoc的内容能被DreamWeaver这样的编辑器正确识别,以实现“所见即所得的”的网页设计,需要在heredoc中增加注释,示例文件如下:
PHP代码如下:
<!--
<?php
print <<<EOT
-->



Untitled Document


<!--
$name = '水木';
print <<<EOT
-->
Hello,$name!
<!--
EOT
print <<<EOT
-->


<!--
EOT;
?>
-->

这样的模板文件,其实就是一个标准的,可以执行的PHP文件。但是,这样的PHP文件,其HTML样式在DreamWeaver中可以正确的显示出来,所有的PHP代码会被看做HTML注释,而且在输出的时候,不会输出出来。比如,上面的文件在DreamWeaver中,被显示成:
PHP代码如下:
Hello,$name!
这样,在设计页面的时候,我们就可以借助DW的可视化界面,进行一些界面的修改,美化等工作。尽管没有实现完全的代码和HTML的分离,但至少提供了一种辅助性的设计手段。

0

Deprecated: strtolower(): Passing null to parameter #1 ($string) of type string is deprecated in /www/wwwroot/testblog.58heshihu.com/var/Widget/Archive.php on line 1032

评论 (0)

取消