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:
- Codeigniter a besoin que mon contruct soit public afin de instancier. Ici, je dois prendre mon singleton.
- Si je le laisse public, plusieurs instances seront créées et la bibliothèque ne fonctionnera plus comme prévu.
Pourquoi avez-vous * besoin * de? –
@MartinBean, j'ai modifié cette publication – manix