如何在zend控制器中自动加载单例类(私有构造函数)?

时间:2012-01-13 05:17:22

标签: zend-framework zend-autoloader

我的models目录中有一个单例类,我必须在Controller类中使用它的函数。通过require_once('文件路径')来完成;并且调用函数作为ClassName :: FunctionName()工作正常,但我需要使用Zend Autoloader而不是通过require_once包含类。我在stackoverflow上遇到了许多解决方案,它们使用bootstrap.php来添加以下代码,它看起来像require_once('文件路径')一样;在控制器中做了

  protected function _initAutoload()
    {   
       Zend_Loader_Autoloader::getInstance();
    }

这样我得到了致命的错误:在{line}上的{path} \ controllers \ SampleController.php中找不到类'ClassName' 我确信我错过了一些东西,但无法弄清楚到底是什么。

3 个答案:

答案 0 :(得分:2)

就像user1145086正确地说,如果你遵循Zend的命名约定,你的类应该是自动加载的。

如果您有一个类,比如说 AutoloadedClass ,并且您希望它自动加载,您可以执行以下操作:

  1. / library 文件夹中创建一个文件夹,并将其命名为'我的'
  2. 在Bootstrap的initAutoload类方法中编写以下代码:

    Zend_Loader_Autoloader::getInstance()->registerNamespace(array('My_'));
    
  3. 将包含'AutoloadedClass'的文件放在刚刚创建的'My'文件夹中,并将文件重命名为AutoloadedClass.php,以便最终找到该文件: /library/My/AutoloadedClass.php
  4. 最后,按照Zend的命名约定,将类本身重命名为My_AutoloadedClass。您可以从应用程序的任何位置使用该类名称My_AutoloadedClass获取对您的类的引用。

答案 1 :(得分:1)

如果你根据zend约定命名你的类,该类应该自动加载没有问题。 如果您的班级位于 /application/models/myClass.php 并且名为:

class Application_Model_MyClass {

    public function myMethod(){
    }
}

它应该自动加载就好了,我不认为单身这一事实会影响自动加载。

如果您需要使用自己的类名,可以在 / library 目录中的自动加载器中添加新的命名空间,将此行添加到 application.ini

autoloaderNamespaces[] = "MyNamespace_"

然后将 / MyNamespace 目录添加到 / library 目录并相应地命名文件:

class MyNamespace_MyClass {
}

希望这有帮助。

答案 2 :(得分:1)

如果库中的类名和位置不遵循Zend naming conventions,那么您可以为该库编写自动加载器并将此自动加载器推送到Zend_Loader_Autoloader堆栈。

有关示例,请参阅https://stackoverflow.com/a/8820536/131824