PHP OO - 我应该如何处理多个类中的软错误?

标签 php oop error-handling

如果这个问题已经在某个地方得到了回答,我深表歉意,但到目前为止我还没有找到答案 - 也许我正在寻找错误的东西!

我正在尝试弄清楚如何处理我的 OO PHP 系统中的错误,该系统用于生成网页。希望这个例子能解释我的意思。

假设我有一个 Content 类、一个 Form 类和一个 FormObject 类,它们包含有关页面内容、Web 表单和表单字段的所有信息。所有类都可以通过 DB 类运行多个 MySQL 查询。 用户可以在后台创建新的内容或表格。当他们这样做时,我使用这些类来创建数据并将其存储在数据库中。

我还有一个系统类,用于生成网页。 System 类检查应在前端显示的内容,构建适当的 Content 和 Form 对象,然后生成 HTML 并将其输出到屏幕。

我对严重错误进行了一些检查,这会阻止代码继续运行。但是,问题是我想向前端反馈一些“软错误”。例如,也许 System 类构建了一个 Form 对象,该对象又使用 FormObject 类构建了字段。 FormObject 类在数据库中查询字段名,但没有找到字段名。所以 DB 类返回一个错误。我希望能够给前端反馈一个消息,说没有找到字段名。

将“软错误”消息返回给系统类的最佳方法是什么,以便可以将其输出到前端? 我意识到在这个特定示例中它相当简单,但是随着更多类的添加,而且至关重要的是,添加了更多级别,问题变得有点大。

我想到的一种方法是创建一个 Error 类。系统将创建一个 Error 对象,并在创建时将其传递给每个 Content 和 Form 对象。 Form 类会将相同的 Error 对象传递给 FormItem 类。每当发现错误时,都会通过 Error 类中的方法记录下来。然后系统可以访问原始错误对象并输出所有错误。然而,随着系统的增长,添加了更多的类,创建了更多的对象,它可能会变得相当困惑。有没有更好的办法?

最佳答案

你可能想使用其中之一

  1. 所有类都可以访问的全局变量(例如全局变量或单例),或者
  2. 传递给类的所有实例化的东西,产生所谓的“软错误”

收集此类错误。然后你想使用你收集的任何东西,并以某种方式将它添加到你的 System 类的输出中。


更具体地说...

这是使用全局的解决方案的示例:

global $softErrorMessages = array();

class A
{
  function sampleFunctionA()
  {
    // [...]
    // some code setting $result to some valid value
    // or to false if an error occured

    if($result === false) // check for validity
    {
      global $softErrorMessages;
      $softErrorMessages[] = "The sample function A caused a soft error";
      return;
     }

    // [...]
    // some code requiring a valid $result
  }
}

如果您使用这样的全局变量,您可以轻松地从您的 System 类访问它,并将其内容放入输出的正确位置。

但是,如果您执行单元测试,您可能不想使用全局或类似全局的解决方案(如单例)。所以这里有一个“错误收集”方法的例子:

class ErrorCollector
{
  private $errors = array();

  function addError($error)
  {
    $this->errors[] = $error;
  }

  function getErrors()
  {
    return $this->errors;
  }
}

class A
{
  private $errorCollector;

  function __construct(/* your additional parameters */, ErrorCollector $errorCollector)
  {
    // [...]
    // additional instantiation stuff

    $this->errorCollector = $errorCollector;
  }

  function sampleFunctionA()
  {
    // [...]
    // some code setting $result to some valid value
    // or to false if an error occured

    if($result === false) // check for validity
    {
      $this->errorCollector->addError("The sample function A caused a soft error");
      return;
     }

    // [...]
    // some code requiring a valid $result
  }

}

您只需将 ErrorCollector 实例化一次,然后将其传递给所有其他类实例化。然后让您的对象执行它们的职责(并可能向 ErrorCollector 添加软错误)。完成后,您的 System 类将获取所有错误消息,并再次将它们放在输出的正确位置。

关于PHP OO - 我应该如何处理多个类中的软错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30945680/

相关文章:

c - C/C++ 中文件读取的重命名文件的扩展问题

php - 无法获取 php.ini 的更新值

matlab - 如何在 MATLAB 2013b 中创建自定义 setter 方法?

javascript - 如何为对象的所有实例调用方法

bash - Bash 在执行脚本时忽略错误的理由是什么?

sql - MS SQL Server : how to determine which field is causing Arifmetic error

php - 在多个类中有效地使用数据

php - 在 php 中对包含连字符 (-) 和点 (.) 的 url 进行编码

php - 如何创建分页器链接

抽象类中的php get_object_vars