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



我的models目录中有一个singleton类,我必须在Controller类中使用它的函数。通过require_one("文件路径")执行;将函数调用为ClassName::FunctionName()可以很好地工作,但我需要使用Zend Autoloader,而不是通过requireonce包含类。我在stackoverflow上看到了许多解决方案,这些解决方案使用bootstrap.php在那里添加以下代码,似乎与require_one("文件路径")相同;在控制器中执行

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

通过这种方式,我得到了致命错误:在{第}行的{path}\controllers\SampleController.php中找不到类"ClassName"我确信我错过了什么,但不知道到底是什么。

正如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从应用程序中的任何位置获取对类的引用

如果根据zend约定命名类,则该类应该会自动加载而不会出现问题。如果您的类位于/application/models/myClass.php并命名为:

class Application_Model_MyClass {
    public function myMethod(){
    }
}

它应该可以自动加载,我不认为单例会影响自动加载。

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

autoloaderNamespaces[] = "MyNamespace_"

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

class MyNamespace_MyClass {
}

希望这能有所帮助。

如果库中的类名和位置不遵循Zend命名约定,则可以为该库编写一个自动加载器,并将该自动加载器推送到Zend_Loader_Autoloader堆栈上。

请参阅https://stackoverflow.com/a/8820536/131824例如。

最新更新