在 Zend Framework (v1) 应用程序中使用 PHP 命名空间

Posted

技术标签:

【中文标题】在 Zend Framework (v1) 应用程序中使用 PHP 命名空间【英文标题】:Using PHP namespaces in a Zend Framework (v1) application 【发布时间】:2011-09-24 16:56:46 【问题描述】:

在 Zend Framework (1.11) 的当前稳定版本中,是否可以使用 php 命名空间处理应用程序类?

Application\Form\Abc instead of Application_Form_Abc
Application\Model\Xyz instead of Application_Model_Xyz
etc.

从 v1.10 开始,ZF 支持autoloading namespaces,并且在包含命名空间库时工作正常,但在尝试对应用程序类执行相同工作时却失败了。

【问题讨论】:

重复***.com/questions/1691793/… @Rufinus:不,我确实看过这个问题,这是 2 岁。命名空间自动加载支持此时尚未推出,作者询问是否可以修改 ZF 以支持此功能。我在问这个功能的一个子集现在是否内置;他们在谈论内部 ZF 类,而我只希望我的 应用程序类 使用命名空间,我不在乎扩展 ZF 的非命名空间类。 你只需要照顾自动加载器,寻找教义 2.0 集成教程,它们有使用命名空间,并且有一个供 zend_loader 使用的自动加载器。 @Rufinus:正如我所提到的,目前 ZF 附带的自动加载器已经处理了命名空间。但我说的是来自例如 ZF 的特定映射。 Application_Form_Abc/application/forms/Abc.php,与标准映射不同。 这个最近的 SO 问题 (***.com/questions/6409424/…) 讨论了它,但(到目前为止)得出的结论是 @Benjamin 指出:ZF1 自动加载器 确实 处理命名空间,但是Zend_Loader_Autoloader_Resource 没有 【参考方案1】:

其实有一个简单的解决方法suggested by Dmitry on the ZF issue tracker:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap

    protected function _initAutoloader()
    
        $loader = function($className) 
            $className = str_replace('\\', '_', $className);
            Zend_Loader_Autoloader::autoload($className);
        ;

        $autoloader = Zend_Loader_Autoloader::getInstance();
        $autoloader->pushAutoloader($loader, 'Application\\');
    

对我来说就像一个魅力!

【讨论】:

【参考方案2】:

1.12 中引入的标准自动加载器允许您轻松使用命名空间:

require 'Zend/Loader/AutoloaderFactory.php';
Zend_Loader_AutoloaderFactory::factory([
    'Zend_Loader_StandardAutoloader' => [
        'autoregister_zf' => true,
        'namespaces' => [
            'Application' => '/path/to/Application/src',
        ]
    ]
]);

现在您可以使用Application\Form\Abc 代替Application_Form_AbcApplication\Model\Xyz 代替Application_Model_Xyz 等。

目录/文件结构示例:

path/to/Application/src/Form/Abc.php

<?php
namespace Application/Form;
class Abc 

path/to/Application/src/Model/Xyz.php

<?php
namespace Application/Model;
class Xyz 

【讨论】:

以上是关于在 Zend Framework (v1) 应用程序中使用 PHP 命名空间的主要内容,如果未能解决你的问题,请参考以下文章

在 Zend Framework 应用程序中从模型/视图/控制器中抛出异常

如何在 Zend Framework 2 中设置第一个应用程序

在共享 cPanel 服务器上托管 PHP Zend Framework 应用程序

将内容管理系统添加到现有 Zend Framework 应用程序

Zend Framework 应用程序中的“会话已启动....”异常

PHP Zend Framework:从应用程序的任何位置获取引导资源