PHP AWS SDK自动加载器与Codeigniter冲突

时间:2012-03-02 18:26:12

标签: php codeigniter amazon-web-services autoload spl-autoload-register

  • 我正在使用Codeigniter 2.1.0。
  • 我使用require_once APPPATH . "/libraries/aws_sdk/sdk.class.php";
  • 将Amazon Web Services SDK包含在自定义模型中

这很有效。但是当CI决定以后需要加载它的db cache类时,它会调用(通过CI_DB_driver :: _ cache_init):

if ( ! class_exists('CI_DB_Cache'))
{
    if ( ! @include(BASEPATH.'database/DB_cache.php'))
    {
        return $this->cache_off();
    }
}

这会触发AWS SDK的自动加载(确切的方法是CFLoader::autoloader)。

我可以通过告诉class_exists不要自动加载来解决这个问题,因为如果class_exists返回false,似乎包含了DB_cache.php:

if ( ! class_exists('CI_DB_Cache', false))
{
    if ( ! @include(BASEPATH.'database/DB_cache.php'))
    {
        return $this->cache_off();
    }
}

这个脏修复工作正常,但显然只能解决当前问题。一般来说,确保CodeIgniter不会与其他库中的自动加载混淆的最佳方法是什么?

请注意:

  • 我读过关于使用spl_autoload_register的点点滴滴。 Codeigniter似乎没有使用它,我不确定我应该如何安全地实现它。我会找到一个可靠的例子,说明我应该如何以及在哪里实现这个最有用的(当然,如果这是解决方案)。
  • AWS SDK似乎已使用spl_autoload_registerspl_autoload_register(array('CFLoader', 'autoloader'));

1 个答案:

答案 0 :(得分:4)

您可能知道,您真的不想修改CI中的核心方法。因此,为了防止CI与您的班级发生冲突,您需要执行与以下内容非常相似的操作:

保持文件夹结构不变,但在aws_sdk文件夹中创建一个新文件 之外 。将它命名为* Aws_loader *或者对你有意义的东西。如果要自动加载sdk,请在CI自动加载器文件中添加:

CI自动加载文件(application / config / autoload.php):

$autoload['libraries'] = array('Aws_loader');

您的初始文件:

class CI_Aws_sdk{
    // for use with PHP < version 5
    /*public function CI_Aws_sdk(){
        require dirname(__FILE__) . DIRECTORY_SEPARATOR . "aws_sdk" .DIRECTORY_SEPARATOR . 'sdk.class.php';
    }*/

    // for use with PHP >= 5
    public function __construct(){
        require dirname(__FILE__) . DIRECTORY_SEPARATOR . "aws_sdk" .DIRECTORY_SEPARATOR . 'sdk.class.php';
    }
}

所以你的目录结构现在看起来像这样:

application --
  config --
  ...
  libraries --
    Aws_loader.php
    aws_sdk --
       sdk.class.php

如果您没有自动加载sdk,那么在您的控制器中,您可以执行此操作:

$this->load->library('Aws_loader');

无论哪种方式,CI都为您加载类并有效地分离其中的任何方法,现在您可以在该类中操作,就像您之前加载的任何其他库或模型一样,而不会干扰CI的方法,类似于这样:

$this->Aws_loader->do_something();

您可以对任何第三方类库使用相同的方法,甚至可以使用您自己编写的方法。非常类似的布置可以用于模型,库,帮助器等。 希望这有帮助!