php - 库作为 Codeigniter 中的单例?

标签 php codeigniter singleton codeigniter-2

我使用单例模式创建了一个自定义库。为什么要这样?因为我需要能够在没有 $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');

请注意,我所有的重要函数都是由允许我使用单例实例的全局函数调用的。但是我遇到了两个问题:

  1. Codeigniter 需要公开我的构造以便 实例化。在这里,我需要带上我的单例。
  2. 如果我让它公开,将创建几个实例和库 将不再按预期工作。

最佳答案

我已经解决了这个问题:)

为了创建单例库,您必须:

  • 像这样在 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/

相关文章:

ASP.net缓存+单例模式

php - 1次使用验证码之类的数据是否应该存储在同一张表中

php - 使用 PHP Echos 和 mySQL 计数查询等

PHP 替换数组值

php - 模仿 CodeIgniter 中退出的使用的类似方法

php - 无法加载第二个 Controller

java - 如果使用@Bean标签创建一个bean,那么我们可以创建两个bean。每个 applicationContext 如何是单例的

javascript - 我如何处理条纹错误 PHP

php - codeigniter 的 sql 查询

iis - 由 IIS 7 和全局变量(单例)托管的 WCF 服务