我使用单例模式创建了一个自定义库。为什么要这样?因为我需要能够在没有 $this-> 引用的情况下调用我的函数,例如,我可以执行以下代码:
function foo() {
MyLibrary::instance()->foo();
}
然后我可以像这样在 Controller 中调用我的函数:
function foo();
代替
$this->mylibrary->foo();
我有麻烦了,因为 CodeIgniter 试图在最佳方法是“读取”静态实例时实例化我的库。
为什么我需要这样做?
我的自定义库必须从位于应用程序文件夹外的/plugins 目录中的外部 php 文件注册“ Hook ”。看:
- /申请
- /插件
- /plugins/helloworld.php
这是我的加载程序库:
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!";
}
最后,我可以在 Controller / View 中调用函数 do_action 来打印消息,如下所示:
do_action('right_here');
请注意,我所有的重要函数都是由允许我使用单例实例的全局函数调用的。但是我遇到了两个问题:
- Codeigniter 需要公开我的构造以便 实例化。在这里,我需要带上我的单例。
- 如果我让它公开,将创建几个实例和库 将不再按预期工作。
最佳答案
我已经解决了这个问题:)
为了创建单例库,您必须:
像这样在 system/core/Codeigniter.php 中包含您的库: require_once("/path/to/library.php");
让你的实例返回&符号,像这样:
单例:
public static function &instance()
{
if (!self::$instance)
{
self::$instance = new Loader();
}
return self::$instance;
}
- 也准备好使用您的功能。此外,您可以包括 th CI 你库中的对象。
关于php - 库作为 Codeigniter 中的单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11128290/