2012-07-11 59 views
1

我有我自己的lib文件夹“classes”。我试图使用Zend库作为独立。 (将他们的类整合到我的应用程序中)。Zend Library与我自己的库冲突

E.g.如下。 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 auto load的问题,它检查并发现它需要在zend文件夹中使用db.class.php。

我如何做到这一点,因为我去Zend和我自己之间分开图书馆。

+0

我想用的Zend自动加载,因为它使事情变得容易得多,我不需要再担心需要哪一类。 – Slay 2012-07-11 19:04:53

回答

2

魔术__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); 
    } 
}); 
+0

嗨,那么spl_autoload_register()所做的是它支持多个自动加载,以便在覆盖我以前的自动加载器时使用zend自动加载器?我对吗? – Slay 2012-07-11 19:23:27

+0

是的 - 您只能使用特殊名称__autoload定义一个函数,这样就无法以这种方式定义两个自动加载器。 'spl_autoload_register'几乎保留了所有应该被认为是自动加载器的注册函数的列表,并且在需要自动加载的时候调用它们,但是副作用是你不能再使用__autoload了。 – Niko 2012-07-11 19:29:02

+0

谢谢你的明确解释和帮助。非常感谢。 – Slay 2012-07-11 19:43:24