、そのヘルパー関数で
私はコード $CI =& get_instance();
を見続ける誰もがこのコードがどのように動作するか私に説明してくださいできますか?
私は$ CIスーパーオブジェクトへの参照を返していますが、get_instance()
はどこから来たのですか?
、そのヘルパー関数で
私はコード $CI =& get_instance();
を見続ける誰もがこのコードがどのように動作するか私に説明してくださいできますか?
私は$ CIスーパーオブジェクトへの参照を返していますが、get_instance()
はどこから来たのですか?
基本的には、静的メソッドの代わりに関数を使用するSingleton Design Patternです。
だから、基本的に、それはシングルトンを強制しませんが、それは公共の機能へのショートカットですsource code
をチェックアウトし、より深く見えるように...
編集:実は、今Iわかる。 PHP4との互換性のために、参照を適切に返すためにはdouble-global-variable-hackを実行しなければなりませんでした。さもなければ、参照はすべて壊れてしまいます。 PHP4は静的メソッド(まあ、とにかく)をサポートしていなかったので、関数を使う方が良い方法でした。だから、それはまだあなたのアプリは、PHP5であれば、は代わりCI_Base::get_instance();
を行うと間違って何があってはならない、それは...あなたがしたいことがいくつかのケースでは
get_instance()は、CodeIgniterのコアファイルで定義されている関数です。スーパーオブジェクトの外側のスコープにいるときに、CodeIgniterスーパーオブジェクトへのシングルトン参照を取得するために使用します。
私はそれがbase.phpなどで定義されていると確信しています。
同じですので...レガシーの理由で
が存在しますあなたのコントローラーとは別に存在するクラスを開発しますが、コードイグナイターのすべてのリソースを利用する能力があります。これは、get_instance()関数を使用すると簡単に可能です。
コントローラ関数内でインスタンス化するクラスは、get_instance()関数を使用するだけでコードイグナイタのネイティブリソースにアクセスできます。この関数は、メインCode Igniterオブジェクトを返します。
$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
など
$この、しかし、唯一の内部動作します:
通常、利用可能CodeIgniterの機能のいずれかを呼び出すためには、$この 構築物が使用する必要がありますコントローラー、モデル、ビューのいずれかを選択します。
まず、変数にCodeIgniterのオブジェクトを割り当てる:
$obj =& get_instance();
あなたが割り当てられたらを独自のカスタムクラス内からCodeIgniterののクラスを使用したい場合は、以下のように、あなたはそうすることができます変数へのオブジェクト、あなたの代わりに$このの変数を使用します:
$obj =& get_instance();
$obj->load->helper('url');
$obj->load->library('session');
$obj->config->item('base_url');
など
注:nはよotice上記get_instance()関数は参照によって渡されていること:
$obj =& get_instance();
これは非常に重要です。参照で代入すると、元のコードイグナイターオブジェクトをコピーを作成するのではなく使用することができます。
あなたは、これはCodeIgniterのは、ライブラリやクラスをロードする方法を理解するためにシングルトン構造であるhere
からこの機能について読むことができます
<?php
/*
====================================
start of the loader class
====================================
*/
class Loader {
protected function _init_class($class){
$C = Controller::get_instance();
$name = strtolower($class);
$C->$name = new $class();
}
public function _class($library){
if(is_array($library)){
foreach($library as $class){
$this->library($class);
}
return;
}
if($library == ''){
return false;
}
$this->_init_class($library);
}
public function view ($param) {
echo $param;
}
}
/*
===============================
End of the loader class
==============================
*/
/*
===============================
start of core controller class
==============================
*/
class Controller {
private static $instance;
function __construct() {
self::$instance = $this;
$this->load = new Loader();
}
public static function get_instance(){
return self::$instance;
}
}
/*
===============================
end of the core controller class
===================================
*/
/*
====================================================
start of library sections (put all your library classes in this section)
=====================================================
*/
class MyLibrary {
private $c;
function __construct() {
$this->c = Controller::get_instance();
}
function say($sentence) {
$this->c->load->view($sentence);
}
}
/*
====================================================
End of the library sections
====================================================
*/
/*
============================================
start of controller section (put all your controller classes in this section)
===========================================
*/
class Foo extends Controller {
function __construct() {
parent::__construct();
$this->load->_class('MyLibrary');
}
function bar() {
$this->mylibrary->say('Hello World');
}
}
/*
==========================================
End of the controller sections
==========================================
*/
$foo = new Foo();
$foo->bar();
CI_Controllerを拡張するクラスのみ、モデル、ビューを使用することができます
$this->load->library('something');
$this->load->helper('something');//..etc
カスタムクラスでは上記のコードを使用できません。カスタムクラスで上記の機能を使用するには CIスーパーオブジェクトとその理由を使用する場合は、あなたはあなたのカスタムクラスで
// this following code will not work
Class Car
{
$this->load->library('something');
$this->load->helper('something');
}
//this will work
Class Car
{
$CI=&get_instance();
$CI->load->library('something');
$CI->load->helper('something');
}
// Here $CI is a variable.
、例えば
を使用する必要がありますか? CIスーパーオブジェクトに関するCIドキュメントを教えてください。 – Girish
ソースコードへのリンクは404. – Bugfixer
+1は実際には '$ CI =&get_instance();の**置換**の使い方を指しています。私はその文書を探している私の顔を叩いていました... – HomeOffice