在类中使用标头

时间:2013-02-14 18:28:03

标签: php

我在包含的类环境中访问一个函数,该类可以抛出一个警报,该警报需要将用户引导回一个包含错误信息的页面。对我来说,引用页面的最佳方式是什么,以便在任何地方从任何地方访问该函数时都可以使用它?

有没有更好的方法来做我想做的事情?

public function checkEnvironment() {

        try {

            // If status is false
            if (!$this->getStatus()) {

                // Generate a new special exception with code
                throw new Alert(6);

            } else {

                $connection = Gateway::checkInstance();

                return $connection->getData('SELECT * FROM control_environment WHERE subdomain = ?', array($this->subdomain[0]));

            }

        } catch (Alert $alert) {

            $_SESSION['error'] = $alert->getData();

            if (!headers_sent()) {

                header('Location: my/file/here.php');

                exit;
            }

        }

    }

1 个答案:

答案 0 :(得分:1)

你严重滥用例外。绝对没有理由在try块中放置一个if语句,它只能抛出一个类型的异常,保证在该块之后立即捕获。你没有为你的代码添加任何东西,但是混乱,实际上没有优势,只需执行if / else而没有异常/捕获。

例外的一点是,你将从当前范围推出,到了可以以有意义的方式实际处理的地方。

选择真正的异常类,该异常类可以传达有关发生的错误的信息。 Alert(6)并没有告诉任何人。然后,在此之上处理该(可能还有许多其他)异常,您可以更加确定重定向是正确的操作过程。您的低级数据库代码不应具有任何概念的浏览器或http或重定向。

else分支的目的是抛出异常时,您的代码也不应该有if分支。 else是多余的。

整个功能应如下所示。

public function checkEnvironment() {

  if (!$this->getStatus())
    // Generate a new special exception with code
    throw new StatusException;

  $connection = Gateway::checkInstance();
  return $connection->getData('SELECT * FROM control_environment WHERE subdomain = ?', array($this->subdomain[0]));

}