每个例外的新类/文件?

时间:2013-12-12 21:06:04

标签: php performance exception

对于一个新项目我决定更新我的编码实践。困扰我的一件事就是使用Exceptions。在过去,我使用了一个自定义类MyException,它继承了常见的Exception类并扩展了它的功能(基本上我创建了一些新类来格式化输出,提供调试信息等):

class MyException extends Exception {
    private $messages = array(
        // ...
        "NOT_LOGGED_IN" => 'Please login to use this API.',
        "INVALID_LOGIN" => 'The login credentials you provided are invalid.',
        "SESSION_TIMED_OUT" => 'Your session has timed out.',
        "INVALID_SESSION" => 'Your login is invalid.',
        // ...
    );

    public function __construct($id,$data=null) {
        if($data == null)
            return parent::__construct($this->messages[$id]);

        return parent::__construct(call_user_func_array('sprintf',array_merge((array)$this->messages[$id],$data)));
    }
}

因此,每次我抛出异常时,我都会调用throw new MyException("INVALID_SESSION")(或任何其他索引)。我觉得使用这种方法对于即将到来的更大,更专业的项目来说可能还不够。例如,如果我看一下Java,我看到他们将每个Exception定义为继承基类Exception的自定义类。此外,在Java和PHP中,我了解到一个文件中只应该有一个类。这对于Java来说是合乎逻辑的,因为它编译为二进制文件,但对于PHP,它必须在每次调用页面时加载并包含所有自定义异常,从而降低性能(并且可能会有大约一百个以上的异常)。

这里的最佳做法是什么?

问候

2 个答案:

答案 0 :(得分:2)

最佳做法是使用尽可能多的异常类,每个异常类都在自己的文件中,并使用autoloader按需加载这些文件。这样,您只需为抛出的异常付费。

答案 1 :(得分:1)

PEAR2对如何定义和使用异常有一些很好的推荐。我建议您阅读它们:https://wiki.php.net/pear/rfc/pear2_exception_policy

PSR-0定义了一个自动加载标准,可以更容易地实例化这些异常。我还建议阅读该标准:https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md