1

以下是我从 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 的结束标记 ( ?>) 不存在,但代码中的所有语句仍然运行良好。我不明白如何在没有完成 PHP tag( ?>) 的情况下执行代码。我进行了研究,但没有得到任何令人满意的解释。任何人都可以在这方面指导我吗?提前致谢。

4

3 回答 3

3

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

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

于 2013-07-22T05:09:07.233 回答
1

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

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

  2. 通过无意中发送标头,您可能引入了安全漏洞:例如,您正在执行重定向,但是标头已经发送,重定向不起作用并且可能会输出页面的其余部分,因此访问者可能会看到什么她不应该看到的。虽然这可以通过使用 exit 来缓解,但你知道这个故事,前提是我们每个人每次都使用良好的编程习惯。

  3. 即使让访问者停留在错误的页面没有安全隐患,通过破坏会话行为,或以我多年来遇到的其他方式,安全性和/或会话周期可能已经受到某种打击结束。

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

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

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

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

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

来自PHP 手册

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

于 2013-07-22T05:09:31.240 回答