我使用单例模式创建了一个自定义库。为什么这样?因为我需要能够在没有 $ this-> 引用的情况下调用我的函数,例如,我可以执行以下代码:
function foo() {
MyLibrary::instance()->foo();
}
然后我可以在控制器中调用我的函数:
function foo();
而不是
$this->mylibrary->foo();
我遇到了麻烦,因为当最好的方法是“读取”静态实例时,CodeIgniter尝试实例化我的库。
为什么我需要这样做?
我的自定义库必须在位于应用程序文件夹之外的/ plugins目录中的外部php文件中注册“hooks”。看:
这是我的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);
}
不,我的helloworld.php(插件)看起来像这样:
add_action('right_here', 'show_message', 11);
function show_message()
{
echo "hello world!";
}
最后,我可以在我的控制器/视图中调用我的函数do_action来打印消息,如下所示:
do_action('right_here');
请注意,我的所有重要函数都由一个允许我使用单例实例的全局函数调用。但我遇到了两个问题:
答案 0 :(得分:3)
我已经解决了问题:)
要创建单身图书馆,您必须:
将您的库包含在system / core / Codeigniter.php中,如下所示: require_once( “/路径/到/ library.php”);
使用& 符号返回您的实例,如下所示:
的Singleton:
public static function &instance()
{
if (!self::$instance)
{
self::$instance = new Loader();
}
return self::$instance;
}