3

我的模型目录中有一个单例类,我必须在 Controller 类中使用它的功能。通过 require_once('file path'); 并调用函数作为 ClassName::FunctionName() 工作正常,但我需要使用 Zend Autoloader 而不是通过 require_once 包含类。我在 stackoverflow 上遇到了许多解决方案,这些解决方案使用 bootstrap.php 来添加以下代码,它似乎与 require_once('file path'); 一样。在控制器中做了

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

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

4

3 回答 3

2

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

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

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

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

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

class Application_Model_MyClass {

    public function myMethod(){
    }
}

它应该自动加载就好了,我认为单例不会影响自动加载。

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

autoloaderNamespaces[] = "MyNamespace_"

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

class MyNamespace_MyClass {
}

希望这可以帮助。

于 2012-01-13T07:10:38.027 回答
1

如果您的库中的类名和位置不遵循Zend 命名约定,那么您可以为该库编写一个自动加载器并将这个自动加载器压入Zend_Loader_Autoloader堆栈。

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

于 2012-01-13T08:34:52.127 回答