2011-01-19 25 views
72

Mirando a través del código fuente de CodeIgniter,

en sus funciones de ayuda sigo viendo código $CI =& get_instance(); puede alguien explicarme cómo funciona este código?

Me sale que está devolviendo una referencia al súper objeto $ CI, pero ¿de dónde viene get_instance()?

Respuesta

66

Básicamente es Singleton Design Pattern que utiliza una función en lugar de un método estático.

a mirar más profundamente, echa un vistazo a la source code

Así que, básicamente, no hace cumplir el único, pero es un acceso directo a una función pública ...

Editar: En realidad, ahora entender. Para la compatibilidad de PHP4 tuvieron que hacer un double-global-variable-hack para que devuelva las referencias correctamente. De lo contrario, las referencias se estropearían. Y como PHP4 no tenía soporte para métodos estáticos (bueno, de todos modos), usar la función era la mejor manera. Por lo tanto, todavía existe por razones de compatibilidad ...

Así que si su aplicación es PHP5 solamente, no debe haber nada malo en hacer CI_Base::get_instance(); lugar, es idéntica ...

+2

Cuando usar IC súper objeto y por qué? ¿Puede indicarme alguna documentación de CI sobre el súper objeto CI? – Girish

+3

el enlace al código fuente está dando 404. – Bugfixer

+1

+1 por apuntar al uso de ** REEMPLAZO ** por '$ CI = & get_instance();' Estaba golpeando mi cara en los documentos en busca de eso ... – HomeOffice

17

get_instance() es una función definida en los archivos centrales de CodeIgniter. Lo usa para obtener la referencia singleton del superobjeto CodeIgniter cuando se encuentra en un ámbito fuera del súper objeto.

Estoy bastante seguro de que está definido en base.php o algo similar.

29

En algunos casos es posible que desee desarrolla clases que existen aparte de tus controladores pero que tienen la capacidad de utilizar todos los recursos de Code Igniter. Esto es fácilmente posible usando las funciones get_instance().

Cualquier clase que crea una instancia en las funciones de su controlador puede acceder a los recursos nativos de Code Igniter simplemente usando la función get_instance(). Esta función devuelve el objeto Code Igniter principal.

Normalmente, para llamar a cualquiera de las funciones disponibles CodeIgniter requiere el uso de la $ este constructo :

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

etc.

$ esto, sin embargo, sólo funciona dentro de sus controladores, sus modelos o sus puntos de vista.Si desea utilizar las clases de CodeIgniter desde dentro de sus propias clases, puede hacerlo de la siguiente manera:

En primer lugar, asigne el objeto CodeIgniter a una variable:

$obj =& get_instance(); 

vez que haya asignado la objeto a una variable, que va a utilizar esa variable en lugar de $ este:

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

etc.

Nota: n voy Otice que el función anterior get_instance() se pasa por referencia:

$obj =& get_instance(); 

Esto es muy importante. Asignar por referencia le permite usar el objeto Code Igniter original en lugar de crear una copia del mismo.

Usted puede leer acerca de esta función desde here

2

se trata de una estructura de producto único para entender cómo el CodeIgniter carga las bibliotecas y clases

<?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

Sólo la clase que se extiende CI_Controller, Modelo, Vista puede utilizar

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

Su clase personalizada no puede usar el código anterior. Para utilizar las características anteriores en su clase personalizada, debe utilizar su

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

por ejemplo, en la clase personalizada

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