PHP __autoload()有异常处理 - 浪费时间?

时间:2013-02-24 18:24:43

标签: php exception autoload

我对OOP有点新意,我正在为自己的应用程序开发一个'框架'。我有自己的自动加载功能,如下所示..以及异常处理对象。我不会使用任何第三方插件(至少我不认为)。

第一个问题:我是否应该在自动加载中处理异常处理,或者我只是过度做事?

第二个问题:我的exceptionHandler类是一个公共函数...因为它将被许多其他应用程序使用,这是正确的吗?谢谢。

谢谢..非常感谢任何输入。

function __autoload( $class ){

    // Define filename pattern to include
    $filename = $_SERVER['DOCUMENT_ROOT'] . '/../app/core/models/' . $class . '.class.php';

    // Require class if it exists
    try {

        if ( is_readable( $filename ) ) {

            require_once ( $filename );
        }
        else {

            throw new Exception( "Class filename doesn't exist or isn't named correctly: $filename" );
        }
    }
    catch ( Exception $e ) {

        // Send to exceptionHandler Class for logging/handling.
        $err = new exceptionHandler( $e, 3 );
    }
}
function __autoload( $class ){ // Define filename pattern to include $filename = $_SERVER['DOCUMENT_ROOT'] . '/../app/core/models/' . $class . '.class.php'; // Require class if it exists try { if ( is_readable( $filename ) ) { require_once ( $filename ); } else { throw new Exception( "Class filename doesn't exist or isn't named correctly: $filename" ); } } catch ( Exception $e ) { // Send to exceptionHandler Class for logging/handling. $err = new exceptionHandler( $e, 3 ); } }

3 个答案:

答案 0 :(得分:0)

任何自动加载功能实际上并不意味着抛出异常,因为它不清楚异常应该在哪里上升,你必须将整个代码包装在try catch块中或定义异常处理程序。

你应该通过trigger_error触发错误,或者更好的是让PHP告诉你什么是无法在实际行中加载的类(因此只是忽略不存在的文件)。< / p>

此外,您不应使用__autoload,而应使用spl_autoload_register

答案 1 :(得分:0)

关于你的第一个问题:不,你不应该。

第一个原因:您应始终能够链接多个自动加载器(请参阅spl_autoload_register),因此如果一个自动加载器发生故障,则第二个自动加载器可能能够加载该类。因此,除非您确切知道自己正在做什么,否则您的自动加载器不应抛出任何错误。

第二个原因:如果所有自动加载尝试都失败,那么php无论如何都会触发错误。正确记录您的PHP错误,您不需要在自动加载器中记录它。

第三个原因:您的自动加载器将是一段将要执行很多的代码。你在这里不想要一个try / catch块。

除此之外:如果自动加载您的exceptionHandler失败,会发生什么?

答案 2 :(得分:0)

感谢Jeffrey和Alexander的反馈。你们让我思考..我最终删除了我自己的自动加载器以获得更简单(更快?)的方法......

在我的配置文件中,我添加了核心应用程序类的包含路径以及模块类:

set_include_path( get_include_path() . PATH_SEPARATOR . APPLICATION_ROOT . 'core' . DIRECTORY_SEPARATOR . PATH_SEPARATOR . APPLICATION_ROOT . 'module' . DIRECTORY_SEPARATOR );
spl_autoload_extensions( '.class.php' );
spl_autoload_register();

到目前为止它有效:)