$ CI =&get_instance();を説明します。


87

codeigniterのソースコードを見ると、

そのヘルパー関数で私はコード$CI =& get_instance(); を見続け ます誰かがこのコードがどのように機能するか私に説明できますか?

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


プロジェクトのどこにも書いてはいけない理由を理解するには、stackoverflow.com / a / 63914758/2943403をお読みください=&
mickmackusa

回答:


73

これは基本的に、静的メソッドの代わりに関数を使用するシングルトンデザインパターンです。

詳細については、ソースコードを確認してください

つまり、基本的にはシングルトンを強制しませんが、パブリック関数へのショートカットです...

編集:実際、今私は理解しています。PHP4との互換性のために、参照を適切に返すために、double-global-variable-hackを実行する必要がありました。そうしないと、参照がすべて台無しになってしまいます。また、PHP4は静的メソッドをサポートしていなかったため(とにかく適切に)、関数を使用する方が良い方法でした。したがって、それはレガシーの理由でまだ存在しています...

したがって、アプリがPHP5のみの場合は、代わりに何も問題はないはずCI_Base::get_instance();です。同じです...


2
CIスーパーオブジェクトを使用する場合とその理由 CIスーパーオブジェクトに関するCIドキュメントを教えてください。
ギリッシュ2012

1
実際にREPLACEMENTの使用法を指し示した+1は$CI =& get_instance();、それを探しているドキュメントに顔をぶつけていました...
HomeOffice 2016

@Bugfixer 404エラーが表示されたら、web.archive.orgを使用してそのリンクを編集してください。そのリンクについてはすでに完了しています
私は

20

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

私はそれがbase.phpまたは同様のもので定義されていると確信しています。


7

CI_Controller、Model、Viewを拡張するクラスのみが使用できます

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

カスタムクラスは上記のコードを使用できません。カスタムクラスで上記の機能を使用するには、次を使用する必要があります

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

たとえば、カスタムクラスで

// 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.

4

これは、codeigniterがライブラリとクラスをロードする方法を理解するためのシングルトン構造です。

<?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();

1

$ CI = get_instance(); ヘルパーで$ thisを$ CIに置き換えることです。


しかし、あなたは自動ロードの定義あなたのヘルパーをしなければならない[ライブラリ]
Tofan

0

それをコンストラクターに入れることは私のために働きました:

function __construct()
{
$this->CI =& get_instance();
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.