Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否为每个异常创建新类/文件?_Php_Performance_Exception - Fatal编程技术网

Php 是否为每个异常创建新类/文件?

Php 是否为每个异常创建新类/文件?,php,performance,exception,Php,Performance,Exception,对于一个新项目,我决定更新我的编码实践。现在困扰我的一件事是异常的使用。在过去,我使用了一个自定义类MyException,它继承了common Exception类并扩展了它的功能(基本上我创建了几个新类来格式化输出、提供调试信息等): 所以每次我抛出一个异常时,我只是调用抛出新的MyException(“无效的会话”)(当然也可以调用任何其他索引)。我觉得对于即将到来的更大、更专业的项目,使用这种方法可能已经不够了。例如,如果我看Java,我会看到它们将每个异常定义为一个自定义类,该类继承基

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

所以每次我抛出一个异常时,我只是调用
抛出新的MyException(“无效的会话”)
(当然也可以调用任何其他索引)。我觉得对于即将到来的更大、更专业的项目,使用这种方法可能已经不够了。例如,如果我看Java,我会看到它们将每个异常定义为一个自定义类,该类继承基类异常。另外,在Java和PHP中,我了解到一个文件中应该只有一个类。这对于Java来说是合乎逻辑的,因为它编译成二进制文件,但对于PHP来说,每次调用页面时都必须加载并包含所有自定义异常,从而降低性能(可能会有大约100多个异常)

这里的最佳实践是什么


问候语

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

PEAR2对如何定义和使用异常有一些很好的建议。我建议大家仔细阅读:


PSR-0定义了一个自动加载标准,使实例化这些异常更加容易。我还建议大家阅读一下这个标准:

现代自动加载方法对于以最小的开销加载大量的小型类文件来说是非常有效的;您似乎误解了大量的小类文件是一项巨大的开销,您可能会惊讶地发现,它可能会使您的代码更高效,而不是更少,因为PHP然后只加载它实际需要的类文件-它减少了脚本的内存占用,分配/释放内存需要很长的时间,所以运行起来更快。注意,java编译成字节码而不是二进制(可执行文件):PHP做完全相同的事情;因此,如果你认为它是“java的逻辑”,那么PHP同样是合乎逻辑的,因为同样的原因,也有产生静态自动装弹工具的工具,比如说它是非常有效的。
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)));
    }
}