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

bhmjp9jg  于 2023-01-01  发布在  PHP
关注(0)|答案(3)|浏览(135)

在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,并且在包含名称空间库时运行良好,但是我在尝试对应用程序类执行相同的工作时失败了。

fgw7neuy

fgw7neuy1#

实际上,Dmitry在ZF问题跟踪器上建议了一个简单的变通方案:

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\\');
    }
}

对我来说就像一种魅力!

vshtjzan

vshtjzan2#

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_Abc,用Application\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 {}
3b6akqbq

3b6akqbq3#

对于那些希望你的控制器工作,而不仅仅是表单和模型的人:)看看Zend\Controller\Dispatcher\Standard.php:174

public function formatClassName($moduleName, $className)

您还需要将_与“\”交换,以获得正确的类名。

相关问题