Php没有开始/结束标签?

时间:2009-09-06 15:05:57

标签: php

是否有可能让php不要求某些文件的开始/结束标记(<?php ?>)? 默认情况下,代码应解释为php。

我知道我可以省略结束标记(?>)。

6 个答案:

答案 0 :(得分:13)

没有。解释器需要标签来知道要解析什么以及什么不解析。

答案 1 :(得分:11)

如果您想从命令行调用PHP脚本,可以使用-r开关保留脚本标记。摘自man php

   -r code        Run PHP code without using script tags ’<?..?>’

现在您可以通过以下方式调用脚本:

php -r "$(cat foo.php)"

答案 2 :(得分:5)

最好不要使用结束标记。开始标记是必要的。

正如MaoTseTongue所提到的,在Zend文档中写道:

对于仅包含PHP代码的文件,绝不允许使用结束标记(“?&gt;”)。它不是PHP所必需的,省略它可以防止意外地将尾随空白空间注入到响应中。

答案 3 :(得分:1)

同样,您可以创建一个扩展名为.php的文本文件,并使用另一个“真正的”php文件来加载该文件,例如

假PHP文件

php_info();

真正的PHP文件

<?
// file_contents returns a string, which can be processed by eval()
eval(file_get_contents('/path/to/file/'.urldecode($_GET['fakefile'])));
?>

此外,你可以使用一些mod_rewrite技巧让网络用户感觉他们正在浏览php文件本身(例如http://example.com/fakefile.php

.htaccess文件:

RewrieEngine On
RewriteRule ^(.*)$ realfile.php?fakefile=$1 [QSA]

但是,如果我没记错的话,您的处理速度会慢一些,eval ed代码处理$GLOBALS$_SERVER$_POST的方式存在一些问题,$_GET和其他变种。您必须创建一个全局变量才能将这些超级全局变量传递给已评估的代码。

例如:

<?
global $passed_post = $_POST;
// only by converting $_POST into a global variable can it be understood by eval'ed code. 
eval("global $passed_post;\n print_r($passed_post);");
?>

答案 4 :(得分:0)

您可以将PHP代码存储在文件或数据库中(不含<?php ?>),然后使用eval()激活它。请注意,代码执行速度会变慢。这里有一个eval()示例:

// Data layer (array, database or whatever).
$arr = array("a","b","c");

// Code layer - hint: you can get the code from a file using file_get_contents().
$str = 'foreach($arr as $v) { echo $v . " "; }';

// Shake + Bake
eval($str);

结果:a b c

答案 5 :(得分:0)

有必要省略close标签,因为比正常过程更早地降低标题可能会产生深远的影响。

参考文献: