【问题标题】:ZF Autoloader to load ancestor and requested classZF Autoloader 加载祖先和请求的类
【发布时间】:2010-03-16 11:40:42
【问题描述】:

我正在将 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 方法的扩展......)就已经足够了。

【问题讨论】:

    标签: php zend-framework


    【解决方案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 似乎是目前的最佳做法。

    【讨论】:

      【解决方案2】:

      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 将使用这个自动加载器而不是默认的。

      【讨论】:

      • 干杯@Gordon,在这种情况下,我将使用@Stefan 展示的 Zend_Loader_Autoloader 方法。像往常一样,我希望能够同时接受这两个答案。嗯……
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 2013-04-08
      • 1970-01-01
      相关资源
      最近更新 更多