【问题标题】:PHP AWS SDK autoloader conflicts with CodeigniterPHP AWS SDK 自动加载器与 Codeigniter 冲突
【发布时间】:2012-03-02 18:26:12
【问题描述】:
  • 我正在使用 Codeigniter 2.1.0。
  • 我正在使用 require_once APPPATH . "/libraries/aws_sdk/sdk.class.php"; 在自定义模型中包含 Amazon Web Services SDK

这很好用。然而,当 CI 决定稍后需要加载它的数据库缓存类时,它会调用(通过 CI_DB_driver::_cache_init):

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

这会触发 AWS 开发工具包的自动加载(确切的方法是 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'));

【问题讨论】:

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


    【解决方案1】:

    您可能知道,您并不想真正修改 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();
    

    您可以对任何第三方类库甚至您自己编写的类库使用相同的方法。非常相似的安排可以用于模型、库、助手等。 希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2019-12-05
      • 2018-09-15
      • 2018-04-05
      • 1970-01-01
      • 2019-03-15
      • 2011-12-08
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多