Przeglądając kod źródłowy Codeigniter,
w jego funkcjach pomocniczych ciągle widzę kod,
$CI =& get_instance();
czy ktoś może mi wyjaśnić, jak działa ten kod?
Rozumiem, że zwraca odwołanie do super obiektu $ CI, ale skąd get_instance()
pochodzi?
Odpowiedzi:
Jest to w zasadzie pojedynczy wzorzec projektowy, który używa funkcji zamiast metody statycznej.
Aby przyjrzeć się głębiej, sprawdź kod źródłowy
Więc w zasadzie nie wymusza singletona, ale jest skrótem do funkcji publicznej ...
Edycja: Właściwie teraz rozumiem. Aby zapewnić kompatybilność z PHP4, musieli zrobić hackowanie podwójnej zmiennej globalnej , aby poprawnie zwróciło odwołania. W przeciwnym razie wszystkie referencje zostałyby schrzanione. A ponieważ PHP4 nie posiadało wsparcia dla metod statycznych (no cóż, właściwie tak), użycie tej funkcji było lepszym sposobem. Więc nadal istnieje ze starszych powodów ...
Więc jeśli twoja aplikacja jest tylko PHP5, nie powinno być nic złego w zrobieniu CI_Base::get_instance();
zamiast tego, jest identyczna ...
$CI =& get_instance();
waliłem twarzą w Dokumenty, szukając tego ...
Tylko klasa, która rozszerza CI_Controller, Model, View może używać
$this->load->library('something');
$this->load->helper('something');//..etc
Twoja klasa niestandardowa nie może używać powyższego kodu. Aby użyć powyższych funkcji w swojej klasie niestandardowej, musisz użyć
$CI=&get instance();
$CI->load->library('something');
$CI->load->helper('something');
na przykład w swojej klasie niestandardowej
// 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.
jest to pojedyncza struktura, aby zrozumieć, w jaki sposób Codeigniter ładuje biblioteki i klasy
<?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();
=&
nigdzie w swoim projekcie.