我在Zend Framework上遇到了这种自动加载的困难。基本上,在库文件夹中有一个名为LunaZend的文件夹。LunaZend有一些可以在Zend Framework中使用的类,这些类具有命名空间,必须仅通过调用命名空间名称自动加载。命名空间类似于LunaZend''DB、LunaZend ''Etc。。。在引导程序中,我有一个_initAutoLoadNS函数,它有
$resource = new Zend_Loader_Autoloader_Resource(array(
'basePath' => APPLICATION_PATH.'/../library/LunaZend/',
'namespace' => 'LunaZend')
);
我希望能够在Zend框架中加载类,只需像一样调用
$t = new LunaZend'Di'DependencyInjector();
然而,我得到错误
致命错误:类未找到"LunaZend''Di''DependencyInjector"在里面我做错了什么?如何处理此命名空间自动加载问题?
谢谢。
是的,这个问题似乎偶尔会弹出,直到a掌握了ZF中名称空间(本地名称空间)的窍门。以下是我对此的看法。这是为所有只想正确加载使用命名空间的第三方的人准备的。这太简单了。
我使用ZF 1.11.11
(根据文档,所有ZF 1.10+版本都有效)。
首先,从1.10开始,ZF支持本地PHP命名空间自动加载,前提是它们符合PSR-0标准。
我想在ZF1项目中添加Symfony2 EventManager组件
首先,和类名一样,名称空间必须和库中的路径匹配。因此,名称空间Symfony'Component'EventDispatcher'EventDispatcher
映射到path/to/lib/Symfony/Component/EventDispatcher/EventDispatcher.php
(其中path/to/lib/
是APPLICATION_PATH . '/library'
;您已经知道了)。我必须提到库文件夹必须在include_path中吗?不,我想我没有。
现在有一个不那么棘手的部分:
<?php
// bootstrap.php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initNsAutoload()
{
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('Symfony'); // this is why is dead simple
/* Don't believe me? Try it:
Zend_Registry::set('events', new Symfony'Component'EventDispatcher'EventDispatcher());
*/
}
}
在控制器中使用命名空间导入怎么样?
<?php
use Symfony'Component'EventDispatcher'Event,
Symfony'Component'EventDispatcher'EventDispatcher;
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
var_dump(new EventDispatcher());
var_dump(new Event());
}
}
因此,只要您使用ZF1.10+,就不需要自定义自动加载器。这个回复是在我偷看之后做出的。
LE:或将其添加到应用程序.ini:autoloaderNamespaces[] = Symfony
AFAIK,ZF1自动加载器不处理真正的PHP 5.3命名空间类。要在真正的命名空间类上使用ZF1自动加载器,需要将分隔符变量配置为'
。(感谢@Mattieu的更正)。但是Zend_Loader_Autoloader_Resource
并没有像我们预期的那样处理路径映射。
您可以使用命名空间感知的自动加载器,比如Doctrine2或ZF2。将其中一个自动加载器推到标准ZF1自动加载器堆栈上应该可以处理它。
您可以使用application.ini加载一些命名空间。
我用了同样的
以下可以是application.ini的示例代码:-
[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
appnamespace = "Application"
;Autoloader Namespace
autoloaderNamespaces.w = "LunaZend_"