【问题标题】:Conflict between Codeigniter AUtoload and Flourish Autoload functionsCodeigniter AUtoload 和 Flourish Autoload 函数之间的冲突
【发布时间】:2010-09-29 15:37:35
【问题描述】:

我正在开发一个 Web 应用程序,使用 Codeigniter (http://codeigniter.com/) 框架和 Flourish 库 (unframework) (http://flourishlib.com/)。

我只是将蓬勃发展的文件夹放到我的应用程序中,然后按照说明创建了一个蓬勃发展的初始化和配置文件(这些文件创建了 Flourish 自动加载)。

这是我的文件夹结构:

---辅助代码\
--------init.php
--------config.php
--------蓬勃发展\
---系统\
---应用程序\
---public_html\

init文件只包含配置文件,配置文件内容如下:

function __autoload($class_name){

{
    // Customize this to your root Flourish directory
    $flourish_root = $_SERVER['DOCUMENT_ROOT'] . '/../auxcode/flourish/';

$file = $flourish_root . $class_name . '.php';

if (file_exists($file)) {
    include $file;
    return;
}

throw new Exception('The class ' . $class_name . ' could not be loaded');

}

在 public_html 中,索引文件的前缀是:

<?php include_once($_SERVER['DOCUMENT_ROOT'] . '/../inc/init.php');

现在,各个自动加载功能(因为每个都有自己的)发生冲突。该应用程序仅在我注释掉任一框架的自动加载功能(及其依赖项)时才有效。

请问如何合并自动加载功能,以便我可以同时访问 CI 并以相同的方式蓬勃发展?

或者如果有更好的方法在一个应用程序中使用这两个系统?祈祷,告诉。

谢谢。

【问题讨论】:

  • 现在我有了另一个想法。我可以简单地将蓬勃发展的功能添加到本机 Codeigniter 自动加载中,以便 Codeigniter 自动加载 Flourish。但我也不知道该怎么做。任何帮助将不胜感激。

标签: php codeigniter autoload


【解决方案1】:

我是 Flourish 的作者。我在入门页面上提供的示例自动加载器只是应该帮助人们在他们还没有环境的情况下开始使用。

在您的情况下,由于您有多个库,我建议您使用spl_autoload_register()。您可以注册 CI 自动加载器,然后注册您的 Flourish。

【讨论】:

  • 非常感谢,wbond。我很感激!我将去 CI 论坛进一步询问有关 CI 自动加载器的信息。当我得到它工作正常时,也许我会回来发布我的答案。
【解决方案2】:

创建一个自定义的 __autoload 函数。将 CI 原件重命名为 __autoload_ci 和 Flourish __autoload_flourish。

当它们成功时,将return true; 添加到两个原始自动加载器非常重要。删除任何错误/异常。 然后部署一个自定义包装器:

 function __autoload($class) {
     __autoload_ci($class) || __autoload_flourish($class);
 }

或者使用spl_autoload_register

【讨论】:

  • 感谢您的快速回复,马里奥!但是我不太清楚如何实现这一点,因为我也是 Codeigniter 的新手。我可以轻松更新蓬勃发展的自动加载功能并将这个新的自定义包装器设置为默认运行(因此包括两个自动加载器)。但是当我在 CI 中搜索自动加载功能时,我发现的只是一组数组。请各位大神指点一下?
  • 我也想知道我应该如何通过扩展 CI 而不是编辑其核心系统文件来做到这一点......谢谢。
  • 似乎 CI 只有 ./system/libraries/Loader.php 而实际上并没有使用 PHP 的 __autoload 功能。我猜它会在属性/子对象访问时自动加载。所以,不知道该怎么办。
  • 再次感谢。您认为 spl_autoload 在这种情况下可以提供帮助吗?
  • 它基本上提供了一个自动加载链。如果您的问题在于阶级冲突,那将无济于事。但是试一试 spt_autoload_register("__autoload_flourish");否则你需要破解 CIs Autoload 类,我一点也不知道该怎么做。
【解决方案3】:

感谢http://codeigniter.com/forums/viewthread/73804/#366081 以及我在 Twitter 上关注的一些 CI 人员提供的一些信息(我问了他们):Eric BarnesDan HorriganPhil SturgeonZack Kitzmiller,我找到了解决方案。如果你和我一样是 CodeIgniter n00b,你可能会喜欢关注这些人。

我删除了 init.php 和 config.php,然后将以下内容塞进了我的 CI 的 config.php 的底部(我还从一个名为 mylibrary 的自定义库中自动加载)。

function multi_auto_require($class) {
if(stripos($class, 'CI') === FALSE && stripos($class, 'PEAR') === FALSE) {
    foreach (array('flourish', 'mylibrary') as $folder){
        if (is_file(APPPATH."../auxengines/{$folder}/{$class}.php")){
            include_once APPPATH."../auxengines/{$folder}/{$class}.php";
        }
    }
}
}

spl_autoload_register('multi_auto_require');

工作出色。谢谢各位!

【讨论】:

    猜你喜欢
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多