【问题标题】:How does the PHP code execute even without closing the ?> PHP tag?即使没有关闭 ?> PHP 标签,PHP 代码如何执行?
【发布时间】:2013-07-22 05:03:29
【问题描述】:

以下是我从 PHP 文件中注意到的代码:

<?php

# Should log to the same directory as this file


$log   = KLogger::instance(dirname(__FILE__), KLogger::DEBUG);
$args1 = array('a' => array('b' => 'c'), 'd');
$args2 = NULL;

$log->logInfo('Info Test');
$log->logNotice('Notice Test');
$log->logWarn('Warn Test');
$log->logError('Error Test');
$log->logFatal('Fatal Test');
$log->logAlert('Alert Test');
$log->logCrit('Crit test');
$log->logEmerg('Emerg Test');

$log->logInfo('Testing passing an array or object', $args1);
$log->logWarn('Testing passing a NULL value', $args2);

您会注意到 PHP 结束标记 (?&gt;) 不存在,但代码中的所有语句仍然运行良好。我不明白如何在没有完成 PHP 标记 (?&gt;) 的情况下执行代码。我进行了研究,但没有得到任何令人满意的解释。任何人都可以在这方面指导我吗?提前致谢。

【问题讨论】:

标签: php


【解决方案1】:

结束标签的存在是为了告诉解释器它应该停止执行文本并逐字输出。与需要打开和关闭标签匹配才能有效的 XML 不同,PHP 解释器只是使用标签来界定执行应该开始和停止的位置。

就像一个 PHP 文件可以没有开始标签 - 这意味着将输出整个内容,所以一旦到达文件结尾执行结束就不需要结束标签。

【讨论】:

  • 并认为省略结束标记是一种很好的做法,以避免将空格(字符、换行符等)输出到缓冲区并因此作为数据发送以防止自定义标题。
【解决方案2】:

虽然我不记得任何其他原因,但比正常课程更早发送标头可能会产生深远的影响。以下只是我现在想到的其中一些:

  1. 虽然当前的 PHP 版本可能具有输出缓冲功能,但您将在其上部署代码的实际生产服务器远比任何开发或测试机器重要得多。而且他们并不总是倾向于立即追随最新的 PHP 趋势。

  2. 1234563因此访问者可能会看到她不应该看到的东西。虽然这可以通过使用 exit 来缓解,但你知道这个故事,前提是我们每个人每次都利用良好的编程习惯。
  3. 即使让访问者停留在错误的页面上没有安全隐患,通过破坏会话行为,或以我多年来遇到的其他方式,安全性和/或会话周期可能最终受到了某种打击。

  4. 如果没有安全性,您可能会对莫名其妙的功能丢失感到头疼。假设您正在实施某种支付网关,并在支付处理器成功确认后将用户重定向到特定 URL。如果发生某种 PHP 错误,甚至是警告,或超出行尾,付款可能仍未处理,用户可能仍然未开单。这也是不必要的重定向是邪恶的原因之一,如果要使用重定向,必须谨慎使用。

  5. 即使在最新版本中,您也可能在 Internet Explorer 中遇到“页面加载已取消”类型的错误。这是因为 AJAX 响应/json 包含包含不应包含的内容,因为某些 PHP 文件中的行结尾过多,就像我几天前遇到的那样。

  6. 如果您的应用程序中有一些文件下载,它们也可能因此中断。即使多年后你也可能不会注意到它,因为下载的具体破坏习惯取决于服务器、浏览器、文件的类型和内容(可能还有一些我不想让你厌烦的其他因素) .

奖励:与这 2 个字符相关的一些陷阱(实际上目前是一个):

  1. 即使是一些著名的库也可能在 ?> 之后包含多余的行尾。一个例子是 Smarty,即使是 2.* 和 3.* 分支的最新版本也有这个。因此,一如既往,请注意第三方代码。额外奖励:删除不必要的 PHP 结尾的正则表达式:在所有包含 PHP 代码的文件中将 (\s*\?>\s*)$ 替换为空文本。

【讨论】:

  • 这回答了为什么你应该这样做,而不是为什么省略结束标记不会导致错误。
【解决方案3】:

来自PHP Manual

文件末尾的 PHP 块的结束标记是可选的,在某些情况下,在使用 include 或 require 时省略它会很有帮助,因此文件末尾不会出现不需要的空格,您仍然会以后可以在响应中添加标头。如果您使用输出缓冲,它也很方便,并且不希望在包含的文件生成的部分末尾看到添加的不需要的空白。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-09
    • 2012-05-22
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    相关资源
    最近更新 更多