Zend Autoloader 使用名称空间来确保您不使用自动加载过程,在那些您不想要的类上。所以你必须为你的类选择一个命名空间。
您可以使用特定于应用程序的名称空间或通用名称空间来开始您的类。像“My_”或“App_”这样的命名空间是通用的,但是例如,如果您的应用程序名称是 Job Board,您可以在类文件中使用像“JB_”这样的命名空间。
您也可以编写自己的自动加载器(全新的,或者通过扩展 Zend 自动加载器)并将其注册为SPL 自动加载器以绕过它。
您的类名不必遵循 Zend Framework 命名约定,只需确保它们具有命名空间并在自动加载器中注册命名空间即可。
在这里,我附上了一段我的代码,它注册了一些要自动加载的资源。我有多个模块,每个模块都有一个关于该模块名称的命名空间。请注意,由于有很多命名空间,我将它们全部注册在一个循环中。
$nameSpaceToPath = array(
'Application' => APPLICATION_PATH,
'Base' => APPLICATION_PATH . '/base',
'Store' => APPLICATION_PATH . '/modules/Store',
'Payment' => APPLICATION_PATH . '/modules/Payment',
'Admin' => APPLICATION_PATH . '/modules/Admin'
);
foreach($nameSpaceToPath as $ns => $path) {
$autoLoaderResource = new Zend_Loader_Autoloader_Resource(
array(
'basePath' => $path,
'namespace' => $ns
)
);
$autoLoaderResource->addResourceType('controller','controllers','Controller');
$autoLoaderResource->addResourceType('model','models','Model');
$autoLoaderResource->addResourceType('mapper','models/mappers','Model_Mapper');
$autoLoaderResource->addResourceType('service','services','Service');
// I'm using _Util_ in the name of my utility classes, I place them in 'utils' directory
$autoLoaderResource->addResourceType('util','utils','Util');
$autoLoaderResource->addResourceType('plugin','plugins','Plugin');
$autoLoaderResource->addResourceType('form','forms','Form');
// I'm using _Exception_ in the name of my module specific exception classes, I place them in 'exceptions' directory
$autoLoaderResource->addResourceType('exception','exceptions','Exception');
$autoLoader->pushAutoloader($autoLoaderResource);
}
当您通过调用定义资源类型时:
$autoLoaderResource->addResourceType('service','services','Service');
您实际上是在告诉 Zend Autoloader 您有一个类型“服务”(第一个参数),它放置在名为“服务”(第二个参数)的目录中,并且您在类名中使用“服务”标记来指定类这个类型。
上面的代码告诉 Zend Autoloader 在路径 'APPLICATION_PATH/modules/store/services/Core.php' 中搜索类 Store_Service_Core。
如您所见,我已经为 APPLICATION_PATH 路径注册了通用的“应用程序”命名空间。这意味着从 Application_ 开始的每个类都将从 APPLICATION_PATH 自动加载。例如,我有一个名为 Application_Init 的类,它使用一些初始化任务,现在 Zend 从路径 APPLICATION_PATH/Init.php 自动加载它。