2

注意:我正在使用输出缓冲。它只是包含在 head() 和 foot() 函数中。

我使用以下模板在我当前的 PHP 项目中创建页面:

<?php
include 'bootstrap.php';
head();
?>

<!-- Page content here -->

<?php
foot();
?>

以下示例是否适合使用 die()?另外,如果有的话,这可能会给我带来什么样的问题?

<?php
include 'bootstrap.php';
head();

try
{
    //Simulate throwing an exception from some class
    throw new Exception('Something went wrong!');
}
catch(Exception $e)
{
    ?>
    <p>Please fix the following error:</p>
    <p><?php echo $e->getMessage(); ?></p>
    <?php
    foot();
    die();
}

//If no exception is thrown above, continue script
doSomething();
doSomeOtherThing();

foot();
?>

基本上,我有一个包含多个任务的脚本,我正在尝试设置一种优雅的方式来通知用户输入错误,同时阻止脚本的其余部分执行。

谢谢!

4

3 回答 3

4

我会这样做:

head();
try {
    somethingPossiblyWithError();
    somethingElse();
} catch (Exception $e) {
    handleError();
}
foot();

不需要死亡。如果在 中引发错误somethingPossiblyWithErrorsomethingElse则将被跳过。foot在这两种情况下都会被执行。

更新:我赞成上校 Shrapnel 的回答,因为我猜你没有考虑过这一点,这是一个有价值的知识。在 PHP 中,您可以通过输出缓冲获得等效功能,而无需显式传递值,但它并不那么漂亮 - 但是,如果您正在调用将打印内容而不将它们作为值返回的函数,它就可以工作,所以有时它很有用知道。

于 2010-06-14T05:51:16.780 回答
3

整个页面结构错误。
虽然这是最普遍的新手错误。

在准备好所有数据之前,永远不要输出任何东西。
您的脚本可能会发送一些 HTTP 标头,可能会设置一些变量以在 header() 或任何内容中使用。

因此,模板的使用是必要的。
您必须将脚本分为两部分 - 获取数据部分和显示数据部分。
因此,您必须将 header() 函数移动得更低。
根据 Amadan 的回答,它可能是

<?php
include 'bootstrap.php';
try {
  getData();
} catch (Exception $e) {
    handleError();
}
head();
body();
foot();
?>

handleError() 函数可以设置适当的 HTTP 错误代码(404 或 500)并用错误消息文本替换正文模板。

于 2010-06-14T07:11:24.113 回答
1

出于多种原因,不推荐您的方法。你应该:

  • 分离表示和逻辑(看看 MVC 模式)
  • 避免程序代码,编写面向对象的 PHP
  • 独立的用户和管理员体验(温和地处理错误)

示例,在上面实现:

<? $page->debug = true; ?>
<?= $page->getHead(); ?>
<?= $page->getBody(); ?>
<?= $page->getFoot(); ?>

class page {

   public debug;

   public function getBody() {
       try {
          //
       } catch (Exception $e) {
          $this->_errorhandler('message');
       }
   }

   protected function _errorhandler($message) {
        if ($this->debug) {
              // display error message
          } else {
             // display nothing, log the error
             // or throw concrete exception
             // or redirect
          }
   }
 ...
}

也不建议这样做(每个任务都需要许多单独的类),但是您明白了重点:分离,而不是混合所有内容。

于 2010-06-14T07:55:51.797 回答