PHP结束标记

初学PHP的时候知道其是嵌入式的脚本语言,以<?php开头?>表示结束,并且不建议使用<??>短标记,没有深究为什么有的时候省略结束标记也是可以的。

PHP解析<?php ?>标记之间的代码,标记之外的代码都将被忽略,如果标记之外误打了一个空格或者换行会有什么问题呢?看下面的示例

a.php文件,最后的[space]表明输入的是一个空格

1
2
3
<?php
$date = '20141001';
?>[space]

b.php文件

1
2
3
4
5
6
<?php
ob_start();
require_once('a.php');
$content = ob_get_contents();
ob_clean();
var_dump($content);

输出的结果是

1
string ' ' (length=1)

结束标记后加入换行符也是如此的,可以发现这会导致PHP开始输出这些空白。或许会问到,如果不去var_dump()不就是没有空格输出了么?但是当PHP程序是一个下载文件的脚本,这样读取到的文件前面就会被改变了,文件下载也就是失败的了。

其实,自己在之前的应用中遇到过这样的问题,当时是想var_dump()一下抓取出来的网页,可是在抓取的网页源码之前始终都有一些空格,现在终于明白问题在哪了。

那么什么时候不需要加结束标记呢?如果是一个需要被包含的文件,没有?>结束标记的话会减少很多问题,比如ob_start header setcookie session_start这些方法之前是不允许有输出的。PHP结束符用于在PHP与HTML混写时指示代码的结束,对于纯PHP文件,文件结束了代码也就结束了,应该忽略PHP结束标记,并插入一段注释说明这是文件的底部并定位这个文件的相对路径,这样有利于确定这个文件是已经结束的而不是被删节的。

另外,PHP结束符在注释中也需要注意一下,在//#注释后加入?>是会影响接下来语句的解析的,当然这在有的编辑器中已经提示出来了,如果注释中需要包含?>则需要使用/**/来注释。


参考资料

Just a beginner.<br /><a href='https://github.com/yaoshanliang/about' target='_blank'>profile</a>