如何在一个文件中欺骗多个类的Zend加载器

时间:2011-05-28 22:26:30

标签: php zend-framework exception-handling

我正在尝试为zend项目实现自定义异常类。 我使用模块,所有课程都在library下。 所以文件名DuplicateFileException.phpAPPLICATION_PATH "/../library/Abra/Exception"包含

class Abra_Exception_FileNotFoundExcpetion extends Exception {}
class Abra_Exception_MissingFileException extends Exception {}
class Abra_Exception_DuplicateFileException extends Exception {}
class Abra_Exception_FileIOException extends Exception {}

所以当我只抛出Abra_Exception_DuplicateFileException时,ErrorController工作正常  因为确实存在一个名为DuplicateFileException的文件,但是当我抛出除Exception以外的任何文件时,app会中断。

我无法相信我必须为每个人创建一个文件。 那么如何解决呢?

感谢阅读。

2 个答案:

答案 0 :(得分:2)

正确的zend-way将实现您自己的自动加载器类。 IT将实现自动加载方法。然后,您可以使用Zend_Autoloader自动加载器堆栈来运行您的类。您只需要在classname->文件名映射中使用某种系统/逻辑。

class Abra_Autoloader 
{
    public function autoload($className)
    {
        if (strpos('Abra_Exception', $className) !== false) {
            include $someFile; //faster
        }
    }
}

//anywhere in bootstrap (preferably in some autoloading section of yours)
//  autoloader will load only classes starting with "abra"
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);
$autoloader->pushAutoloader(array('Abra_Autoloader ', 'autoload'), 'Abra'); 

请注意,至少teh autoloader类应该是Zend_Loader-loadable :)

答案 1 :(得分:1)

Zend自动加载器的工作原理是将请求的类名映射到文件系统路径,这样就无法为文件名不匹配的类加载文件。

如果您真的想要坚持这条路径,我只需将该文件包含在您的Bootstrap类中,例如

protected function _initRequires()
{
    require_once 'Abra/Exception/DuplicateFileException.php';
    // assuming your "library" folder is on the include path
}