2012-06-20 4 views
4

J'ai créé une bibliothèque personnalisée en utilisant le modèle singleton. Pourquoi par là? parce que je dois être en mesure d'appeler mes fonctions sans $ this-> référence, par exemple, je pouvais exécuter le code ci-dessous:Bibliothèque comme singleton dans Codeigniter?

function foo() { 
    MyLibrary::instance()->foo();   
} 

alors je pourrais appeler mes fonctions dans les contrôleurs comme ceci:

function foo(); 

au lieu de

$this->mylibrary->foo(); 

Je suis en difficulté parce que CodeIgniter essayer d'instancier ma bibliothèque quand la meilleure façon de faire est de « lire » e L'instance statique

Pourquoi j'ai besoin de faire ça?

Ma bibliothèque personnalisée doit enregistrer des «hooks» à partir de fichiers php externes situés dans le répertoire/plugins en dehors du dossier de l'application. Regardez:

  • /application
  • /plugins
  • /plugins/helloworld.php

Ceci est ma bibliothèque Loader:

class Loader{ 

    public static $instance; 
     protected $hooks; 

    private function __construct($params = array()){ 
     $this->hooks= array(); 
     $this->includePlugins(); 
    } 

    public static function instance() 
     { 
      if (!self::$instance) 
      { 
       self::$instance = new Loader(); 
      } 

      return self::$instance; 
     } 

    public function includePlugins() 
    { 
     include_once "/plugins/helloworld.php"; 
    } 

    public function do_action($hook= "after") 
    { 
     foreach ($this->actions[$hook] as $function) 
     { 
      call_user_func_array($function, array()); 
     } 

    } 

    public function add_action($hook, $function, $priority) 
    { 
     if ($hooks !== false) 
     { 
     $this->actions[$hook][] = $function; 
     } 
     else 
     { 
     echo "hook name is unavalaible"; 
     } 
    } 

} 



/** 
* Functions using the Singleton instance !!! 
*/ 

function do_action($hook) 
{ 
    Loader::instance()->do_action($hook); 
} 

function add_action($hook, $function, $priority) 
{ 
    Loader::instance()->add_action($hook, $function, $priority); 
} 

Non, mon helloworld.php (plugin) ressemble à ceci:

add_action('right_here', 'show_message', 11); 
function show_message() 
{ 
    echo "hello world!"; 
} 

Enfin, je pourrais appeler mon la fonction do_action dans mon contrôleur/vue afin d'imprimer le message, comme celui-ci:

do_action('right_here'); 

Notez que toutes mes fonctions importantes sont appelées par une fonction globale qui me permettent de utilisez l'instance singleton. Mais je ressentais deux questions:

  1. Codeigniter a besoin que mon contruct soit public afin de instancier. Ici, je dois prendre mon singleton.
  2. Si je le laisse public, plusieurs instances seront créées et la bibliothèque ne fonctionnera plus comme prévu.
+1

Pourquoi avez-vous * besoin * de? –

+0

@MartinBean, j'ai modifié cette publication – manix

Répondre

3

J'ai résolu le problème :)

Afin de créer une bibliothèque singleton, vous devez:

  • Inclure votre bibliothèque système/core/Codeigniter.php comme ceci: require_once ("/ chemin/vers/bibliothèque.. Php ");

  • Faites votre instance retour avec & symbole, comme ceci:

Singleton:

public static function &instance() 
{ 
    if (!self::$instance) 
     { 
      self::$instance = new Loader(); 
     } 

     return self::$instance; 
} 
  • Prêt à utilise vos fonctions et aussi, vous pouvez inclure l'objet CI dans votre bibliothèque