我对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 );
}
}
答案 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();
到目前为止它有效:)