Dans Codeigniter, get_instance()
est disponible dans le monde entier la fonction qui retourne le Contrôleur de super-objet qui contient toutes les chargés de cours (il retourne le Contrôleur instance de classe). Je vais inclure le code source de courant:
get_instance()
est définie en Codeigniter.php
// Load the base controller class
require BASEPATH.'core/Controller.php';
function &get_instance()
{
return CI_Controller::get_instance();
}
Et CI_Controller
est définie en Controller.php
class CI_Controller {
private static $instance;
/**
* Constructor
*/
public function __construct()
{
self::$instance =& $this;
// Assign all the class objects that were instantiated by the
// bootstrap file (CodeIgniter.php) to local class variables
// so that CI can run as one big super object.
foreach (is_loaded() as $var => $class)
{
$this->$var =& load_class($class);
}
$this->load =& load_class('Loader', 'core');
$this->load->set_base_classes()->ci_autoloader();
log_message('debug', "Controller Class Initialized");
}
public static function &get_instance()
{
return self::$instance;
}
}
Voici comment il est recommandé pour être utilisé dans le guide de l'utilisateur pour créer des bibliothèques:
En utilisant CodeIgniter Ressources au sein de Votre Bibliothèque
Pour accéder à CodeIgniter natif de ressources au sein de votre utilisation de la bibliothèque de l'
get_instance()
fonction. Cette fonction renvoie le CodeIgniter super objet.Normalement à partir de votre contrôleur, vous appeler tout de disponibles CodeIgniter fonctions à l'aide de l'
$this
construire:$this->load->helper('url'); $this->load->library('session'); $this->config->item('base_url');
etc.
$this
, cependant, ne fonctionne directement dans votre contrôleurs, votre modèles, ou de votre point de vue. Si vous souhaitez utiliser CodeIgniter les classes de à partir de vos propres classes personnalisées, vous pouvez le faire comme suit:Tout d'abord, affectez la CodeIgniter objet à une variable:
$IC =& get_instance();
Une fois que vous avez assigné l'objet à une variable, vous devez utiliser variable au lieu de
$this
: $IC =& get_instance(); $IC->load->helper('url'); $IC->load->library('session'); $IC->config->item('base_url'); etc.Note: Vous remarquerez que le ci-dessus
get_instance()
fonction est en cours passé par référence:$IC =& get_instance();
C'est très important. L'assignation par référence vous permet d'utiliser le original CodeIgniter objet plutôt que d'en créer une copie.
Related posts: expliquer $IC =& get_instance(); / Codeigniter: Obtenir Instance
Donc, voici ma question:
Pourquoi le guide de l'utilisateur vous recommandons d'assigner get_instance()
à une variable? Je suis assez certain que je comprends les conséquences de ne pas l'assignation par référence, mais pourquoi est-il recommandé d'affecter à une variable lors de l' get_instance()->load->model()
fonctionne bien?
Je vois beaucoup d'défini par l'utilisateur ou un tiers des classes de CI que de céder à une propriété de l'objet:
class MY_Class {
private $CI;
function __construct()
{
$this->CI =& get_instance();
}
function my_func()
{
$this->CI->load->view('some_view');
}
function my_other_func()
{
$this->CI->load->model('some_model');
}
}
Mauvais exemple, mais je le vois souvent. Pourquoi s'embêter avec cette méthode, au lieu de simplement en appelant get_instance()
directement? Il semble comme affectation de l'ensemble de la commande de l'objet à une variable de classe ne serait pas une bonne idée, même si c'est une référence. Peut-être qu'il n'a pas d'importance.
Je veux écrire une fonction wrapper pour get_instance()
il est donc plus facile à taper, et je n'ai pas à constamment l'affecter à une variable.
function CI()
{
return get_instance();
}
Ou:
function CI()
{
$CI =& get_instance();
return $CI;
}
Ensuite, j'ai pu utiliser CI()->class->method()
à partir de n'importe où, sans les tracas de l'affecter à une variable, il est très facile d'écrire et de comprendre ce qu'il fait, et peut résulter en une plus courte, plus le code élégant.
- Est-il une raison de ne pas prendre cette approche?
- Quelle est la différence entre les deux
CI()
fonctions ci-dessus? - Pourquoi est-il recommandé d'assigner
get_instance()
à une variable plutôt que de l'appeler directement? - Ce qui ne l'
&
enfunction &get_instance(){}
moyenne où il est défini? Je sais un peu ce que les références sont pour, et je les utiliser lorsque cela est approprié, mais je n'ai jamais vu une fonction définie de cette façon. Si je dois écrire une fonction wrapper, dois-je l'utiliser?
Veuillez noter que ce n'est pas tant un style de question, mais une technique. Je veux savoir si il y a des problèmes, la performance ou autrement, avec l'aide de la méthode que je suggère.
EDIT: pour l'instant nous avons:
- Le chaînage de méthode n'est pas disponible en php4, le fait de les affecter à une variable est une solution de contournement (même si c'est assez inutile comme Codeigniter a abandonné le support de php4)
- Le mineur généraux de l'appel d'une fonction plus d'une fois pour retourner l'objet, plutôt que de l'appeler à la fois et de les assigner à une variable.
Autre chose, ou sont-ils les seuls problèmes potentiels?