首页 文章

ZF Autoloader加载祖先和请求的类

提问于
浏览
2

我正在将Zend Framework集成到现有的应用程序中 . 我想将应用程序切换到Zend的自动加载机制来替换几十个 include() 语句 .

不过,我对自动加载机制有特殊要求 . 请允许我详细说明 .

现有应用程序使用核心库(独立于ZF),例如:

/Core/Library/authentication.php
/Core/Library/translation.php
/Core/Library/messages.php

这个核心库始终保持不变,并提供许多应用程序 . 该库包含类似的类

class ancestor_authentication { ... }
class ancestor_translation { ... }
class ancestor_messages { ... }

在应用程序中,还有一个Library目录:

/App/Library/authentication.php
/App/Library/translation.php
/App/Library/messages.php

这些包括扩展祖先类,并且是实际在应用程序中实例化的类 .

class authentication extends ancestor_authentication { }
class translation extends ancestor_translation { }
class messages extends ancestor_messages { }

通常,这些类定义是空的 . 他们只是扩展他们的祖先并提供类名来实例化 .

$authentication = new authentication();

此解决方案的目的是能够轻松自定义应用程序的各个方面,而无需修补核心库 .

现在,我需要的自动加载器必须知道这个结构 . 当请求类 authentication 的对象时,自动装带器必须:

1. load  /Core/Library/authentication.php
2. load  /App/Library/authentication.php

我目前的方法是创建一个自定义函数,并将其绑定到 Zend_Loader_Autoloader 以获取特定的名称空间前缀 .

  • 在Zend有没有办法做到这一点我忽略了? this question中接受的答案意味着有,但这可能只是一个错误的措辞选择 .

  • Zend Autoloader是否有扩展功能?

  • 你能 - 我是ZF的新手 - 想一个优雅的方式,符合框架的精神,用这个功能扩展Autoloader吗?我没有必要寻找一个现成的实现,一些指针(这应该是 xyz 方法的扩展,你会像这样调用......)已经足够了 .

2 回答

  • 1

    为了扩展Gordon已经指出的内容,我将创建自己的自动加载器类来实现 Zend_Loader_Autoloader_Interface 并将其推送到 Zend_Loader_Autoloader -stack .

    class My_Autoloader implements Zend_Loader_Autoloader_Interface 
    {
        public function autoload($class) 
        {
            // add your logic to find the required classes in here
        }
    }
    
    $autoloader = Zend_Loader_Autoloader::getInstance();
    // pushAutoloader() or unshiftAutoloader() depending on where 
    // you'd like to put your autoloader on the stack
    // note that we leave the $namespace parameter empty
    // as your classes don't share a common namespace
    $autoloader->pushAutoloader(new My_Autoloader(), '');
    

    我不会采用 Zend_Loader 方法,即使尚未弃用,新的 Zend_Loader_Autoloader 似乎是目前的最佳做法 .

  • 1

    manual on Zend_Loader

    默认情况下,自动装带器配置为匹配“Zend_”和“ZendX_”命名空间 . 如果您有自己的库代码使用自己的命名空间,则可以使用registerNamespace()方法将其注册到自动装载器 .

    $autoloader->registerNamespace('My_');
    

    请注意,自动加载器遵循ZF命名约定,因此 Zend_Foo_Bar 将在 Zend/Foo/Bar.php 中查找 .

    然而,

    您还可以注册任意自动加载器回调,可选择使用特定命名空间(或命名空间组) . Zend_Loader_Autoloader将在使用其内部自动加载机制之前尝试匹配这些 .

    $autoloader->pushAutoloader(array('ezcBase', 'autoload'), 'ezc');
    

    另一种方法是create custom class Loader extending Zend_Loader然后注册它:

    Zend_Loader::registerAutoload('My_Loader');
    

    然后,ZF将使用此自动加载器而不是默认加载器 .

相关问题