Zend Resource Autoloaders不适用于命名空间

时间:2011-06-20 09:47:10

标签: php zend-framework

我与Zend Framework进行了这种自动加载。基本上在库文件夹中有一个名为LunaZend的文件夹。 LunaZend有一些可以在Zend Framework中使用的类,这些类具有名称空间,只能通过调用名称空间名称自动加载。 命名空间就像LunaZend \ DB,LunaZend \ Etc ...... 在bootstrap中我有_initAutoLoadNS函数,其中有

$resource = new Zend_Loader_Autoloader_Resource(array(
                        'basePath'  =>  APPLICATION_PATH.'/../library/LunaZend/',
                        'namespace' => 'LunaZend')
       );

我希望只能通过调用

来加载Zend Framework中的类
$t = new LunaZend\Di\DependencyInjector();

但是我收到了错误

  

致命错误:类   找不到'LunaZend \ Di \ DependencyInjector'   在...   我究竟做错了什么?如何处理这个名称空间自动加载问题?

谢谢。

3 个答案:

答案 0 :(得分:3)

是的,好吧,这个问题似乎偶尔弹出,直到ZF中的命名空间(本地的)被挂起。这是我对此的看法。这适用于那些只想正确加载某些使用名称空间的第三方的人。这很简单。

我正在使用ZF 1.11.11(根据文档,所有ZF版本1.10 +都可以使用)。

首先,从1.10开始,ZF支持本机PHP名称空间自动加载,只要它们符合PSR-0 standard

我想在ZF1项目中添加Symfony2 EventManager组件  首先,与类名一样,命名空间必须与库中的路径匹配。 因此,名称空间Symfony\Component\EventDispatcher\EventDispatcher映射到path/to/lib/Symfony/Component/EventDispatcher/EventDispatcher.phppath/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());
    }
}

因此,只要您使用ZF 1.10+,就不需要自定义自动加载器。这个回复是在我偷看this之后做出的。

LE:或将其添加到 application.ini
autoloaderNamespaces[] = Symfony

答案 1 :(得分:2)

AFAIK,ZF1自动加载器不处理正版PHP 5.3命名空间类。要在真正的命名空间类上使用ZF1自动加载器,您需要将分隔符变量配置为\。 (感谢@Mattieu的更正)。但是Zend_Loader_Autoloader_Resource没有按照我们预期的方式处理路径映射。

您可以使用名称空间感知自动加载器,如Doctrine2或ZF2。将其中一个自动加载器推入标准ZF1自动加载器堆栈应该可以处理它。

答案 2 :(得分:0)

您可以使用application.ini加载一些命名空间。

我使用了相同的

以下可以是application.ini的示例代码: -

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
appnamespace = "Application"

;Autoloader Namespace
autoloaderNamespaces.w = "LunaZend_"