4

シングルトン パターンを使用してカスタム ライブラリを作成しました。なぜこのように?$this->参照なしで関数を呼び出せるようにする必要があるため、たとえば、次のコードを実行できます。

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

次に、次のようにコントローラーで関数を呼び出すことができます。

function foo();

それ以外の

$this->mylibrary->foo();

CodeIgniter が静的インスタンスを「読み取る」ことが最善の方法であるときにライブラリをインスタンス化しようとするため、問題が発生しています。

なぜこれを行う必要があるのですか?

私のカスタム ライブラリは、アプリケーション フォルダの外の /plugins ディレクトリにある外部 php ファイルから「フック」を登録する必要があります。見て:

  • /応用
  • /プラグイン
  • /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!";
}

最後に、次のようにメッセージを出力するために、コントローラー/ビューで関数 do_action を呼び出すことができます。

do_action('right_here');

すべての重要な関数は、シングルトン インスタンスを使用できるようにするグローバル関数によって呼び出されることに注意してください。しかし、次の 2 つの問題が発生しています。

  1. Codeigniter は、インスタンス化するために私のコントラクトがパブリックである必要があります。ここで、シングルトンを取得する必要があります。
  2. 公開すると、いくつかのインスタンスが作成され、ライブラリが期待どおりに機能しなくなります。
4

1 に答える 1

3

私は問題を解決しました:)

シングルトン ライブラリを作成するには、次のことを行う必要があります。

  • 次のように system/core/Codeigniter.php にライブラリを含めます。

  • 次のように、インスタンスを&記号で返すようにします。

シングルトン:

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

        return self::$instance;
}
  • 機能もすぐに使用できます。また、ライブラリに CI オブジェクトを含めることもできます。
于 2012-06-24T14:24:53.987 に答える