2011-01-19 4 views
72

、そのヘルパー関数で

私はコード $CI =& get_instance(); を見続ける誰もがこのコードがどのように動作するか私に説明してくださいできますか?

私は$ CIスーパーオブジェクトへの参照を返していますが、get_instance()はどこから来たのですか?

答えて

66

基本的には、静的メソッドの代わりに関数を使用するSingleton Design Patternです。

だから、基本的に、それはシングルトンを強制しませんが、それは公共の機能へのショートカットですsource code

をチェックアウトし、より深く見えるように...

編集:実は、今Iわかる。 PHP4との互換性のために、参照を適切に返すためにはdouble-global-variable-hackを実行しなければなりませんでした。さもなければ、参照はすべて壊れてしまいます。 PHP4は静的メソッド(まあ、とにかく)をサポートしていなかったので、関数を使う方が良い方法でした。だから、それはまだあなたのアプリは、PHP5であれば、代わりCI_Base::get_instance();を行うと間違って何があってはならない、それは...あなたがしたいことがいくつかのケースでは

+2

、例えば

$CI=&get instance(); $CI->load->library('something'); $CI->load->helper('something'); 

を使用する必要がありますか? CIスーパーオブジェクトに関するCIドキュメントを教えてください。 – Girish

+3

ソースコードへのリンクは404. – Bugfixer

+1

+1は実際には '$ CI =&get_instance();の**置換**の使い方を指しています。私はその文書を探している私の顔を叩いていました... – HomeOffice

17

get_instance()は、CodeIgniterのコアファイルで定義されている関数です。スーパーオブジェクトの外側のスコープにいるときに、CodeIgniterスーパーオブジェクトへのシングルトン参照を取得するために使用します。

私はそれがbase.phpなどで定義されていると確信しています。

29

同じですので...レガシーの理由で

が存在しますあなたのコントローラーとは別に存在するクラスを開発しますが、コードイグナイターのすべてのリソースを利用する能力があります。これは、get_instance()関数を使用すると簡単に可能です。

コントローラ関数内でインスタンス化するクラスは、get_instance()関数を使用するだけでコードイグナイタのネイティブリソースにアクセスできます。この関数は、メインCode Igniterオブジェクトを返します。

$this->load->helper('url'); 
$this->load->library('session'); 
$this->config->item('base_url'); 

など

$この、しかし、唯一の内部動作します:

通常、利用可能CodeIgniterの機能のいずれかを呼び出すためには、$この 構築物が使用する必要がありますコントローラー、モデル、ビューのいずれかを選択します。

まず、変数にCodeIgniterのオブジェクトを割り当てる:

$obj =& get_instance(); 

あなたが割り当てられたらを独自のカスタムクラス内からCodeIgniterののクラスを使用したい場合は、以下のように、あなたはそうすることができます変数へのオブジェクト、あなたの代わりに$このの変数を使用します:

$obj =& get_instance(); 
$obj->load->helper('url'); 
$obj->load->library('session'); 
$obj->config->item('base_url'); 

など

注:nはよotice上記get_instance()関数は参照によって渡されていること:

$obj =& get_instance(); 

これは非常に重要です。参照で代入すると、元のコードイグナイターオブジェクトをコピーを作成するのではなく使用することができます。

あなたは、これはCodeIgniterのは、ライブラリやクラスをロードする方法を理解するためにシングルトン構造であるhere

2

からこの機能について読むことができます

<?php 

/* 
==================================== 
start of the loader class 
==================================== 
*/ 
class Loader { 


    protected function _init_class($class){ 
    $C = Controller::get_instance(); 
    $name = strtolower($class); 
    $C->$name = new $class(); 
    } 

    public function _class($library){ 
    if(is_array($library)){ 
     foreach($library as $class){ 
     $this->library($class); 
     } 
     return; 
    } 

    if($library == ''){ 
     return false; 
    } 

    $this->_init_class($library); 
    } 

    public function view ($param) { 
    echo $param; 
    } 
} 
/* 
=============================== 
End of the loader class 
============================== 
*/ 

/* 
=============================== 
start of core controller class 
============================== 
*/ 

class Controller { 

    private static $instance; 

    function __construct() { 
    self::$instance = $this; 
    $this->load = new Loader(); 
    } 


    public static function get_instance(){ 
    return self::$instance; 
    } 
} 
/* 
=============================== 
end of the core controller class 
=================================== 
*/ 

/* 
==================================================== 
    start of library sections (put all your library classes in this section) 
===================================================== 
*/ 

class MyLibrary { 

private $c; 

function __construct() { 
    $this->c = Controller::get_instance(); 
} 

function say($sentence) { 
    $this->c->load->view($sentence); 
} 
} 
/* 
==================================================== 
    End of the library sections 
==================================================== 
*/ 

/* 
============================================ 
    start of controller section (put all your controller classes in this section) 
=========================================== 
*/ 

class Foo extends Controller { 

    function __construct() { 
    parent::__construct(); 
    $this->load->_class('MyLibrary'); 
    } 

    function bar() { 
    $this->mylibrary->say('Hello World'); 
    } 
} 


/* 
========================================== 
    End of the controller sections 
========================================== 
*/ 

$foo = new Foo(); 
$foo->bar(); 
0

CI_Controllerを拡張するクラスのみ、モデル、ビューを使用することができます

$this->load->library('something'); 
$this->load->helper('something');//..etc 

カスタムクラスでは上記のコードを使用できません。カスタムクラスで上記の機能を使用するには CIスーパーオブジェクトとその理由を使用する場合は、あなたはあなたのカスタムクラスで

// this following code will not work 
Class Car 
{ 
    $this->load->library('something'); 
    $this->load->helper('something'); 
} 

//this will work 
Class Car 
{ 
    $CI=&get_instance(); 
    $CI->load->library('something'); 
    $CI->load->helper('something'); 
} 
// Here $CI is a variable. 
関連する問題