0

我发现当 Zend 尝试自动加载一个不存在的文件时,它会抛出一个我无法在 try/catch 块中捕获的错误。当我使用时class_exists也会发生这种情况。我已经通过破解 zend 解决了这个问题:

if ($once) {
    if (!@include_once ($filename)) {
        throw new Exception("Failed to include $filename");
    }
    // include_once $filename;
}
else {
    if (!@include ($filename)) {
        throw new Exception("Failed to include $filename");
    }
    // include $filename;
}

注释掉的行是zend 的原件。现在我可以捕获无法包含文件时引发的异常。任何人都可以提出一种更清洁的方法来做到这一点,它不涉及黑客 zend 吗?

我在 Zend 版本 1.11.10 上,有问题的代码是 Zend_Loader 第 146 行。

谢谢。

4

2 回答 2

1

而不是使用 include 或 include_once 尝试使用Zend_Loader::loadClass()

这是API:Zend_Loader::loadClass($class, $dirs)

一个例子:

Zend_Loader::loadClass('Container_Tree',
    array(
        '/home/production/mylib',
        '/home/production/myapp'
    )
);

现在介绍一下它是如何工作的:

通过将下划线替换为操作系统的目录分隔符并附加'.php' ,将指定类的字符串转换为相对路径。在上面的示例中,*'Container_Tree'* 在 Windows 上变为'Container\Tree.php' 。

如果$dirs是一个字符串或一个数组,*Zend_Loader::loadClass()* 按照提供的顺序搜索目录。第一个匹配文件被加载。如果指定的$dirs中不存在该文件,则搜索 PHP 环境的 include_path。

如果加载后找不到文件或类不存在,*Zend_Loader::loadClass()* 抛出Zend_Exception

这应该允许您对任何不存在的类使用 try/catch 块。Zend_Loader::loadFile() 也有类似的功能。

于 2012-07-01T06:35:37.943 回答
0

不要尝试自动加载不存在的类。如果由于某种原因您尝试自动加载的类可能存在也可能不存在,请使用class_exists()调用包装该部分代码。

我想不出你为什么要class_exists()在失败时抛出异常,因为它的唯一目的是让你检查类的存在。

于 2012-06-30T09:23:08.280 回答