Codeigniter では、get_instance()
これはグローバルに利用可能な関数で、現在ロードされているすべてのクラスを含む Controller スーパーオブジェクトを返します (Controller クラスのインスタンスを返します)。現在のソース コードを記載します。
get_instance()
は次のように定義されますCodeigniter.php
// Load the base controller class
require BASEPATH.'core/Controller.php';
function &get_instance()
{
return CI_Controller::get_instance();
}
そして、CI_Controller
次のように定義されますController.php
class CI_Controller {
private static $instance;
/**
* Constructor
*/
public function __construct()
{
self::$instance =& $this;
// Assign all the class objects that were instantiated by the
// bootstrap file (CodeIgniter.php) to local class variables
// so that CI can run as one big super object.
foreach (is_loaded() as $var => $class)
{
$this->$var =& load_class($class);
}
$this->load =& load_class('Loader', 'core');
$this->load->set_base_classes()->ci_autoloader();
log_message('debug', "Controller Class Initialized");
}
public static function &get_instance()
{
return self::$instance;
}
}
推奨される使用方法は次のとおりです。ライブラリ作成のユーザーガイド:
ライブラリ内で CodeIgniter リソースを活用する
ライブラリ内の CodeIgniter のネイティブ リソースにアクセスするには、
get_instance()
関数を使用します。この関数は、CodeIgniter スーパー オブジェクトを返します。通常、コントローラー関数内からは、次のような構文を使用して、利用可能な CodeIgniter 関数のいずれかを呼び出します
$this
。$this->load->helper('url'); $this->load->library('session'); $this->config->item('base_url');
$this
ただし、コントローラ、モデル、またはビュー内で直接のみ機能します。独自のカスタム クラス内から CodeIgniter のクラスを使用する場合は、次のようにします。まず、CodeIgniter オブジェクトを変数に割り当てます。
$CI =& get_instance();
オブジェクトを変数に割り当てたら、次の代わりにその変数を使用します
$this
: $CI =& get_instance(); $CI->load->helper('url'); $CI->load->library('session'); $CI->config->item('base_url'); など。
get_instance()
注: 上記の関数は参照渡しされていることがわかります。$CI =& get_instance();
これはとても重要です。参照による割り当てにより、CodeIgniter オブジェクトのコピーを作成するのではなく、元の CodeIgniter オブジェクトを使用できるようになります。
関連記事:$CI =& get_instance(); を説明します。/Codeigniter: インスタンスの取得
それで、これが私の実際の質問です:
ユーザー ガイドではなぜget_instance()
変数への割り当てを推奨しているのでしょうか。参照による割り当てを行わないことの意味はほぼ理解しているのですが、正常に動作するのに変数への割り当てが推奨されるのはなぜでしょうかget_instance()->load->model()
。
CI には、オブジェクトのプロパティに割り当てるユーザー定義クラスやサードパーティ クラスが多数あります。
class MY_Class {
private $CI;
function __construct()
{
$this->CI =& get_instance();
}
function my_func()
{
$this->CI->load->view('some_view');
}
function my_other_func()
{
$this->CI->load->model('some_model');
}
}
悪い例ですが、私はこれをよく見ます。なぜこのメソッドをget_instance()
直接呼び出すのではなく、わざわざこのメソッドを使うのでしょうか?思われるたとえば、Controller オブジェクト全体をクラス変数に割り当てるのは、たとえそれが参照であっても、あまり良い考えではありません。おそらく、それは問題ではありません。
get_instance()
入力しやすく、常に変数に割り当てる必要がないように、ラッパー関数を記述したいと思います。
function CI()
{
return get_instance();
}
または:
function CI()
{
$CI =& get_instance();
return $CI;
}
そうすれば、変数に割り当てる手間をかけずにどこからでも使用できCI()->class->method()
、記述も機能の理解も非常に簡単になり、より短くエレガントなコードを作成できます。
- このアプローチを採用しない理由はあるでしょうか?
- 上記の2 つの機能には違いがありますか
CI()
? get_instance()
変数を直接呼び出すのではなく、変数に割り当てることが推奨されるのはなぜですか?- 定義されている
&
inとはどういう意味ですか?function &get_instance(){}
参照は for であり、適切な場合に使用しますが、このように定義された関数は見たことがありません。ラッパー関数を作成する場合は、これも使用する必要がありますか?
これは、スタイル技術的な質問です。パフォーマンスに問題があるかどうか知りたいですもしくはそうでないか私が提案する方法を使用してください。
編集: これまでのところ:
- メソッドチェーンは php4 では利用できないため、変数に割り当てることが回避策となります (ただし、Codeigniter は php4 のサポートを廃止したため、これはあまり関係ありません)
- 関数を 1 回呼び出して変数に割り当てるのではなく、オブジェクトを返すために関数を複数回呼び出すことによるわずかなオーバーヘッド。
他に何かありますか、それともこれらが唯一の潜在的な問題でしょうか?
ベストアンサー1
私の知る限り、それは何よりも利便性の問題です。ライブラリで CI スーパー オブジェクトを頻繁に使用する可能性が高いので、それを変数に割り当てて、操作を少し簡単にするのはいかがでしょうか。
他にも考慮すべきことがいくつかあります...
- このメソッドをヘルパーに配置すると、そのメソッドは、それを使用しているすべてのクラスの依存関係になります。これは、あなたにとっては大した問題ではないかもしれませんが、ライブラリを他の人と共有したい場合、特に CI コミュニティでこれを処理する標準的な方法が既にあるため、依存関係について相手が不満を抱く可能性があります。
get_instance()
ヘルパーの結果を変数に保存するのではなく、ヘルパーを使用するたびに呼び出すため、パフォーマンスにわずかな影響があります。- これは時間を節約するためのヘルパー メソッドであるため、CI のコア MVC ファイルで主に作業しているユーザーにとっては、このようなヘルパーを設定するのは、必要な場所で変数に設定するだけの場合よりも時間がかかります。