没有开头/结尾标签的Php?

11

是否有可能使某些文件中的php代码不需要开始/结束标签(<?php ?>)?

代码应默认解释为php。

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


2
你不想这样做是否有特定的原因? - robjmills
2
这不是一个明智的默认行为。不要这样做。 - Imagist
1
@e.c.ho:只要你不想在文件末尾添加非 PHP 代码,你就会发现它可以工作。这也是一些框架(例如 Zend Framework)编码标准所推荐的。重点是,如果没有结束标记,你不能在闭合标记后有空格。 - Pascal MARTIN
3
在MVC结构中,控制器/模型内部的代码看起来很丑陋。我知道这不是什么大不了的事情,但我已经写了4年的PHP代码,但它始终感觉不对劲。 - vise
3
似乎大家都认为这是用于Web编程,但PHP也可以作为通用脚本语言使用。在这种情况下,标签并不总是那么有用。 - Ryan Graham
显示剩余2条评论
4个回答

18
如果您想要从命令行调用PHP脚本,可以使用-r选项而不必使用脚本标签。摘自man php
   -r code        Run PHP code without using script tags ’<?..?>’
现在你可以按以下方式调用你的脚本:
php -r "$(cat foo.php)"

那么为什么这行代码 php -r 'echo "Hello World!\n";' 总是会抛出错误 PHP Parse error: syntax error, unexpected ''echo' (T_ENCAPSED_AND_WHITESPACE), expecting end of file in Command line code on line 1 - Vicky Dev
@VickyDev 不确定,对我来说它仍然有效(PHP 7.1.16)。你使用的是哪个平台/版本? - viam0Zah
Windows 7 64位和PHP 7.1.x稳定版,但它从未按照我所提到的方式工作,尽管它没有语法错误。 - Vicky Dev

13

不可以。解释器需要标签以了解哪些内容需要解析,哪些内容无需解析。


3
为了补充这个答案,PHP标签外的任何内容都会简单地作为文本发送到浏览器。PHP最初被设计成一种模板语言,其中PHP标签与HTML交错使用,而不是相反。 - DisgruntledGoat

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技巧,让Web用户感觉自己正在浏览php文件本身(例如http://example.com/fakefile.php)。

.htaccess文件:

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

然而,如果我没记错的话,你的处理速度会慢一些,并且使用eval运行的代码有一些问题,如何处理$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);");
?>

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接