【发布时间】:2011-11-03 01:23:21
【问题描述】:
为了更深入地了解 MVC 范式,我正在尝试构建自己的框架。
我没有依赖 PHP 因包含失败而导致的丑陋错误/警告,而是设置了一个通用异常类,它以更易于阅读的格式显示数据以及堆栈跟踪。
这是我到目前为止的代码......
spl_autoload_register(__NAMESPACE__.'\Autoloader::coreLoader');
spl_autoload_register(__NAMESPACE__.'\Autoloader::appLoader');
spl_autoload_register(__NAMESPACE__.'\Autoloader::throwException');
class Autoloader
{
private static $isError = false;
private static function loadHelper($className)
{
//Relevant code here
}
public static function coreLoader($className)
{
$classPath = static::loadHelper($className);
if (!@include PRIVATE_ROOT.DIRECTORY_SEPARATOR.$classPath.PHPEXT)
{
static::$isError = true;
}
else
{
static::$isError = false;
}
}
public static function appLoader($className)
{
$classPath = static::loadHelper($className);
if (!@include SYSTEM_PATH.DIRECTORY_SEPARATOR.$classPath.PHPEXT)
{
static::$isError = true;
}
else
{
static::$isError = false;
}
}
public static function throwException($className)
{
if (static::$isError)
{
throw new Exception_General('Attempted to load file: '.$className);
}
}
}
鉴于include 在找不到文件时不会产生异常,我不能使用 try/catch 块。
代替 try/catch 块,我发现可以使用上面代码中的if statement 来检查include 语句是否成功加载所需的文件。
我的Exception_General 类负责生成和显示开发人员友好的错误输出/消息。我在这里面临的问题是,如果我在合法的自动加载方法中抛出异常,脚本将正确地停止。
这当然不理想,因为第一个自动加载方法可能找不到请求的类,spl_autoload 队列中的第二个或第三个自动加载方法可能能够找到请求的文件/类。
为了适应这种行为,我发现我必须创建第三个“假”自动加载方法,它是队列中最后一个被调用的方法——该方法检查错误标志,如果设置,则抛出例外。
在一个有点冗长的问题中,我真正要问的是——是否有更好的方法来捕获失败的包含,并且一旦所有自动加载功能都运行正常,就采取适当的行动吗?
【问题讨论】:
标签: php model-view-controller exception include autoload