编程语言
首页 > 编程语言> > PHP OO-如何处理多个类中的软错误?

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

作者:互联网

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

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

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

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

我对严重错误进行了一些检查,这些检查使代码无法继续执行.但是,问题是我想将一些“软错误”反馈给前端.例如,也许System类构建一个Form对象,该对象又使用FormObject类构建字段. FormObject类向数据库查询字段名,但是找不到字段名.因此,数据库类返回错误.我希望能够将一条消息反馈到前端,提示未找到字段名称.

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

我想到的一种方法是拥有一个Error类.系统将创建一个Error对象,并在创建它们时将其传递给每个Content和Form对象. Form类会将相同的Error对象传递给FormItem类.每当发现错误时,都会通过Error类中的方法记录该错误.然后,系统可以访问原始的Error对象并输出所有错误.但是,随着系统的发展,添加了更多的类,并创建了更多的对象,这可能会引起混乱.有没有更好的办法?

解决方法:

您可能要使用

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

收集此类错误.然后,您想使用收集到的任何内容,然后以某种方式将其添加到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类将获取所有错误消息,并将它们再次放置在输出的正确位置.

标签:oop,error-handling,php
来源: https://codeday.me/bug/20191120/2041636.html