- 我使用的是Codeigniter 2.1.0
- 我正在使用
require_once APPPATH . "/libraries/aws_sdk/sdk.class.php";
将AmazonWebServicesSDK包含在一个自定义模型中
这很有效。但是,当CI决定以后需要加载其数据库缓存类时,它会调用(通过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_register
:spl_autoload_register(array('CFLoader', 'autoloader'));
正如您可能知道的,您并不是真的想修改CI中的核心方法。因此,为了防止CI与您的类发生冲突,您需要做一些非常类似的事情:
保持文件夹结构不变,但在您的aws_sdk文件夹外部创建一个新文件。把它命名为*Aws_loader*或对你有意义的东西。如果要自动加载sdk,则在CI自动加载文件中添加:
CI自动加载文件(application/config/Autoload.php):
$autoload['libraries'] = array('Aws_loader');
您的init文件:
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();
您可以对任何第三方类库,甚至是您自己编写的类库使用相同的方法。一种非常相似的安排可以用于模型、库、助手等。希望这能有所帮助!