【问题标题】:PHP incomprehensible control flowPHP难以理解的控制流程
【发布时间】:2014-11-02 21:27:20
【问题描述】:

我已经完成了几个 PHP 项目,但距离专家还很遥远。我现在正在尝试调试其他人编写的应用程序。

代码中有一点我不太理解,而且我没有想法。以下是一些背景信息。

该代码应该检索一个 PDF 文件并使用显示的 PDF 文件呈现一个页面 内部div。对于某些文件,这是有效的。对于其他文档,将 PDF 文件发送到客户端(打开浏览器下载对话框)并且不显示任何页面。

我添加了很多fwrite 来在页面呈现时将某些操作记录到日志文件中。令我惊讶的是,我有以下情况:

fwrite($fh, "HERE3\n");

$templateMgr =& TemplateManager::getManager();

fwrite($fh, "HERE4\n");

当页面正确呈现时,两行('HERE3' 和 'HERE4')都会被记录。 当页面根本不呈现并且发送 PDF 文件以供下载时,仅记录“HERE3”。

令我困惑的是这怎么可能发生:两条日志行之间没有 ifreturn!我对没有记录第二行的代码的唯一解释是它在记录“HERE3”后崩溃。但是,我希望两者中的任何一个:

  1. 代码记录这两行并一直持续到最后并呈现页面 (OK),或者
  2. 代码只记录第一行,然后崩溃并且不产生任何输出。相反,程序会向客户端发送一个 PDF 文件。

我还记录了对 getManager() 的调用,它返回时不会崩溃。

所以,我的问题是,这段代码如何在函数调用后中断执行,却产生有意义的输出?

【问题讨论】:

  • 在不知道 getManager 做什么的情况下无法给出答案。
  • @WvanRij:但是子程序可以跳过脚本的其余部分并仍然产生响应吗?无论如何,getManager() 首先尝试从注册表中检索一个对象,如果找不到,它会创建一个新对象。构造函数非常复杂,我仍在尝试理解它。但是,子程序如何跳过脚本的其余部分并仍然产生输出?
  • @Giorgio php 脚本中的任何地方都可以调用die;exit; 并且执行将在该点停止。

标签: php


【解决方案1】:

Template::getManager 后面的代码是什么? 你的代码中可能有一个exit;

在使用header() 发送http 下载输出后调用exit; 是一种常见用法,因为知道此函数不会停止脚本,但它具有重定向行为。通常你不需要执行其余的。所以一定要检查退出功能;)

【讨论】:

  • 谢谢,这似乎是一个合理的寻找。真的好多年没接触PHP了。
  • 它比普通的 exit() 复杂一点,但你给了我正确的提示。 +1 并被接受。
  • 经过更多调试后,我发现在执行“HERE3”之前已经发送了标头。然后getManager() 检测到这一点(或某些等效条件),并决定退出。我还没有找到确切的点,但这让我可以通过查看发送标头的代码来追溯错误的根本原因。
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
相关资源
最近更新 更多