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?
php
codeigniter
Hailwood
sumber
sumber
=&
di mana pun dalam proyek Anda.Jawaban:
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 ...sumber
$CI =& get_instance();
saya membenturkan wajah saya di Dokumen mencari itu ...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.
sumber
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.
sumber
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();
sumber
$ CI = get_instance (); adalah mengganti $ this menjadi $ CI pada helper,
sumber
Menempatkannya di konstruktor berhasil untuk saya:
function __construct() { $this->CI =& get_instance(); }
sumber