【问题标题】:Php without start/end tags?没有开始/结束标签的PHP?
【发布时间】:2009-09-06 15:05:57
【问题描述】:

是否可以让 php 不需要某些文件的开始/结束标签 (<?php ?>)? 代码默认解释为php。

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

【问题讨论】:

  • 是否有您不想这样做的具体原因?
  • 这不是一个正常的默认行为。不要这样做。
  • @e.c.ho : 试试 ^^ 你会发现它有效(只要你不希望文件末尾有任何非 php 代码);;几个框架的编码标准也推荐它(例如 Zend Framework)——关键是如果没有结束标签,你不能在结束标签后有空格。
  • @seengee 在 MVC 结构中,代码在控制器/模型中看起来很难看。我知道这没什么大不了的,但是我已经编写了 4 年的 php 代码,但总是感觉不对。
  • 每个人似乎都在假设这是针对 Web 编程的。 PHP 作为通用脚本语言也非常有用。在这种情况下,标签并不总是那么有用。

标签: php


【解决方案1】:

如果您想从命令行调用您的 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
  • @VickyDev 不确定,它仍然适用于我(PHP 7.1.16)。你有什么平台/版本?
  • Windows 7 64Bit 和 PHP 7.1.x 稳定,但它从来没有像我提到的那样工作,尽管它没有语法错误。
【解决方案2】:

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

【讨论】:

  • 要添加这个答案,PHP 标记之外的任何内容都只是作为文本发送到浏览器。 PHP 最初的目的是作为一种模板语言,其中 PHP 标记穿插在 HTML 中,而不是相反。
【解决方案3】:

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

正如MaoTseTongue 提到的,在Zend 文档中有这样写:

对于只包含 PHP 代码的文件,关闭标签 ("?>") 是不允许的。 PHP 不需要它,省略它可以防止意外将尾随空格注入响应。

【讨论】:

  • 我以前听说过这个,我很好奇是什么?是否与文件末尾的空格有关导致问题(例如,在发送标头之前发送输出等)。
  • errr...我的意思是“为什么”,对不起!
  • 不包含结束 php 标记可防止“意外将尾随空格注入响应”。 (参见 [Zend 框架文档][1])。 [1]:framework.zend.com/manual/en/…
  • 使用结束标签很好(对于那些喜欢标签平衡的人来说,美观)。关键是不要在结束 php 标记之后包含任何尾随空格(例如回车、换行、制表符、空格等),因为 Web 服务器实际上会将这些字符发送到浏览器。即便如此,对于大多数提供 html、xml、json 的 Web 应用程序来说,它通常是无害的。但在动态构建二进制数据(如图像)时可能会导致问题。另一次让你陷入麻烦的是当你的 php 代码意外地发送了空格时设置 http 标头。
【解决方案4】:

同样,您可以创建一个具有 .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]

但是,如果我没记错的话,您的处理速度会慢一些,并且evaled 代码如何处理$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);");
?>

【讨论】:

    【解决方案5】:

    您可以将 PHP 代码存储在文件或数据库中(不带&lt;?php ?&gt;),然后使用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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-26
      • 2013-02-03
      • 1970-01-01
      • 2016-01-11
      • 2016-10-31
      • 2016-02-12
      相关资源
      最近更新 更多