2
  • 我使用的是Codeigniter 2.1.0。
  • 我使用require_once APPPATH . "/libraries/aws_sdk/sdk.class.php";

這種運作良好,包括亞馬遜Web服務SDK在一個自定義模式。然而,當CI以後決定它需要加載它的數據庫緩存類,它調用(通過CI_DB_driver :: _ cache_init):PHP AWS SDK自動加載器與Codeigniter衝突

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

這觸發了AWS SDK的自動加載(具體方法爲CFLoader::autoloader)。

我能解決這個問題,告訴class_exists不會自動加載,因爲它似乎DB_cache.php包含無論如何,如果class_exists返回false:

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'));

回答

4

正如你可能知道,你真的不希望被修改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(); 

對任何第三方類庫甚至是自己編寫的類都可以使用相同的方法。一個非常類似的安排可以用於模型,圖書館,幫手等等。 希望這有助於!