ZF Autoloader加载祖先和请求的类

时间:2010-03-16 11:40:43

标签: php zend-framework

我正在将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 个答案:

答案 0 :(得分: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将使用此自动加载器而不是默认加载器。

答案 1 :(得分:1)

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

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目前似乎是最佳做法。