【问题标题】:Zend Library Conflicts with My Own LibraryZend 库与我自己的库冲突
【发布时间】:2012-07-11 19:01:17
【问题描述】:

我在文件夹“classes”中有自己的库。我正在尝试将 Zend 库用作独立库。 (将他们的课程集成到我的应用中)。

例如如下。 Zend 类都放在一个叫 Zend 的文件夹下

类/db.class.php

类/Zend/translate.php ....

我以前使用自动加载功能来加载类。

if (!function_exists ("__autoload")){
function __autoload($class_name) 
{

    if(file_exists(ABSPATH.'/classes/'.$class_name.'.class.php')){
        require_once ABSPATH.'/classes/'.$class_name.'.class.php';
    }   

}
}

我的函数检查我的应用程序是否需要我的类,如果是,我将从我的“类”文件夹中加载它,如果不是,它将从 Zend 文件夹中加载。

每当我打电话时

require_once ABSPATH.'/classes/Zend/Loader/Autoloader.php'; 
$loader = Zend_Loader_Autoloader::getInstance(); 

它一直说我的“自己的”类没有加载。我认为这是 Zend 自动加载的问题,它检查并发现它需要 zend 文件夹中的 db.class.php。

当我在 Zend 和我自己的库之间进行分离时,我该怎么做。

【问题讨论】:

  • 我想使用 Zend 自动加载,因为它让事情变得更容易,我不需要担心需要哪个类。

标签: php zend-framework


【解决方案1】:

神奇的__autoload 函数不支持多个自动加载器。如果您如上所示指定自定义自动加载器,然后注册 Zend 自动加载器,则以前安装的自动加载器将被 Zend 自动加载器覆盖。

由于 Zend 组件使用 spl_autoload_register(),您也可以使用此方法(支持多个自动加载器 - 它基本上安装一个自动加载器来处理另一个(用户定义的)自动加载器堆栈)。

http://php.net/manual/function.spl-autoload-register.php

// Example (requires PHP >= 5.3 because of the anonymous function)
spl_autoload_register(function($className) {
    $fileName = ABSPATH .'/classes/'. $className .'.class.php';
    if (is_readable($fileName)) {
        require_once($fileName);
    }
});

【讨论】:

  • 嗨,那么 spl_autoload_register() 的作用是它支持多个自动加载,以便在覆盖我以前的自动加载器时 zend 自动加载器?我说的对吗?
  • 是的 - 您只能使用特殊名称 __autoload 定义一个函数,因此您无法以这种方式定义两个自动加载器。 spl_autoload_register 几乎保留了所有应被视为自动加载器的已注册函数的列表,并在需要自动加载时调用它们,但副作用是您不能再使用 __autoload
  • 感谢您的清晰解释和帮助。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 2014-01-04
相关资源
最近更新 更多