【问题标题】:How to Trick Zend loader for multiple classes in one file如何在一个文件中为多个类欺骗 Zend 加载器
【发布时间】:2011-09-04 02:47:24
【问题描述】:

我正在尝试为 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 的文件,但是当我抛出除该异常之外的任何其他内容时,应用程序就会中断。

我简直不敢相信我必须为每个人创建一个文件。 那么如何解决呢?

感谢阅读。

【问题讨论】:

  • 这似乎不是很传统。这几乎就像我会创建 4 或 5 次空文件
  • 它从哪个约定摇摆不定?大多数 OOP 语言似乎更喜欢直接的类到文件映射

标签: php zend-framework exception-handling


【解决方案1】:

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

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'); 

请注意,至少自动加载器类应该是 Zend_Loader-loadable :)

【讨论】:

  • 您好,感谢您的建议。您的代码假定 Abra_Autoloader 类位于 APPLICATION_PATH "/../library/Abra".but 下:$autoloader->pushAutoloader(array('Abra_Autoloader ', 'autoload'), 'Abra');
【解决方案2】:

Zend 自动加载器通过将请求的类名映射到文件系统路径来工作,因此您不能让它为文件名不匹配的类加载文件。

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

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

【讨论】:

  • 主要是因为它会在引导时加载它们。想象一下,您在一个文件中有 Zend_GData(20 多个类)之类的东西。包含这样的代码库对内存消耗非常不利。即使在不需要时也需要它。对于示例中的简单 4 行文件,它会做,但通常这是一个不好的做法。
猜你喜欢
  • 2018-11-23
  • 2011-02-07
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
相关资源
最近更新 更多