jelaskan $ CI = & get_instance ();

87

Melihat melalui kode sumber codeigniter,

dalam fungsi penolongnya Saya terus melihat kode $CI =& get_instance(); Adakah yang bisa menjelaskan kepada saya bagaimana kode ini bekerja?

Saya mengerti bahwa itu mengembalikan referensi ke objek super $ CI, tetapi dari mana get_instance()asalnya?

Hailwood
sumber
Harap baca stackoverflow.com/a/63914758/2943403 untuk memahami mengapa Anda tidak boleh menulis =&di mana pun dalam proyek Anda.
mickmackusa

Jawaban:

73

Ini pada dasarnya adalah Pola Desain Singleton yang menggunakan fungsi alih-alih metode statis.

Untuk melihat lebih dalam, lihat kode sumbernya

Jadi pada dasarnya, itu tidak memberlakukan singleton, tapi itu jalan pintas ke fungsi publik ...

Edit: Sebenarnya, sekarang saya mengerti. Untuk kompatibilitas PHP4, mereka harus melakukan double-global-variable-hack agar dapat mengembalikan referensi dengan benar. Jika tidak, referensi akan kacau balau. Dan karena PHP4 tidak memiliki dukungan untuk metode statis (yah, bagaimanapun juga), menggunakan fungsi adalah cara yang lebih baik. Jadi itu masih ada karena alasan warisan ...

Jadi, jika aplikasi Anda hanya PHP5, seharusnya tidak ada yang salah dengan melakukannya CI_Base::get_instance();, itu identik ...

ircmaxell
sumber
2
Kapan menggunakan objek super CI dan mengapa? Dapatkah Anda menunjukkan kepada saya beberapa dokumentasi CI tentang objek super CI?
Girish
1
+1 untuk benar-benar menunjuk ke penggunaan PENGGANTIAN karena $CI =& get_instance();saya membenturkan wajah saya di Dokumen mencari itu ...
HomeOffice
@Bugfixer Jika Anda melihat kesalahan 404 itu, harap edit tautan itu menggunakan web.archive.org . Sudah selesai untuk tautan itu
Saya adalah Orang Paling Bodoh
20

get_instance () adalah fungsi yang didefinisikan dalam file inti CodeIgniter. Anda menggunakannya untuk mendapatkan referensi tunggal ke objek super CodeIgniter saat Anda berada dalam cakupan di luar objek super.

Saya cukup yakin itu didefinisikan di base.php atau yang serupa.

Menyeberang
sumber
7

Hanya kelas yang memperluas CI_Controller, Model, View yang dapat digunakan

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

Kelas Kustom Anda tidak dapat menggunakan kode di atas. Untuk menggunakan fitur di atas di kelas kustom Anda, Anda harus menggunakan

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

misalnya, di kelas khusus Anda

// 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.
Khant Wai Kyaw
sumber
4

ini adalah struktur tunggal untuk memahami bagaimana codeigniter memuat library dan class

<?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();
souparno majumder
sumber
1

$ CI = get_instance (); adalah mengganti $ this menjadi $ CI pada helper,

Untuk penggemar
sumber
tetapi Anda harus menentukan pembantu Anda pada autoload [library]
Tofan
0

Menempatkannya di konstruktor berhasil untuk saya:

function __construct()
{
$this->CI =& get_instance();
}
Tejpal Sharma
sumber