如果这个问题已经在某个地方得到了回答,我深表歉意,但到目前为止我还没有找到答案 - 也许我正在寻找错误的东西!
我正在尝试弄清楚如何处理我的 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 类中的方法记录下来。然后系统可以访问原始错误对象并输出所有错误。然而,随着系统的增长,添加了更多的类,创建了更多的对象,它可能会变得相当困惑。有没有更好的办法?
最佳答案
你可能想使用其中之一
- 所有类都可以访问的全局变量(例如全局变量或单例),或者
- 传递给类的所有实例化的东西,产生所谓的“软错误”
收集此类错误。然后你想使用你收集的任何东西,并以某种方式将它添加到你的 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/