codeigniterのソースコードを見ると、
そのヘルパー関数で私はコード$CI =& get_instance();
を見続け
ます誰かがこのコードがどのように機能するか私に説明できますか?
$ CIスーパーオブジェクトへの参照を返しているget_instance()
ようですが、どこから来たのですか?
回答:
これは基本的に、静的メソッドの代わりに関数を使用するシングルトンデザインパターンです。
詳細については、ソースコードを確認してください
つまり、基本的にはシングルトンを強制しませんが、パブリック関数へのショートカットです...
編集:実際、今私は理解しています。PHP4との互換性のために、参照を適切に返すために、double-global-variable-hackを実行する必要がありました。そうしないと、参照がすべて台無しになってしまいます。また、PHP4は静的メソッドをサポートしていなかったため(とにかく適切に)、関数を使用する方が良い方法でした。したがって、それはレガシーの理由でまだ存在しています...
したがって、アプリがPHP5のみの場合は、代わりに何も問題はないはずCI_Base::get_instance();
です。同じです...
$CI =& get_instance();
、それを探しているドキュメントに顔をぶつけていました...
CI_Controller、Model、Viewを拡張するクラスのみが使用できます
$this->load->library('something');
$this->load->helper('something');//..etc
カスタムクラスは上記のコードを使用できません。カスタムクラスで上記の機能を使用するには、次を使用する必要があります
$CI=&get instance();
$CI->load->library('something');
$CI->load->helper('something');
たとえば、カスタムクラスで
// 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.
これは、codeigniterがライブラリとクラスをロードする方法を理解するためのシングルトン構造です。
<?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();
それをコンストラクターに入れることは私のために働きました:
function __construct()
{
$this->CI =& get_instance();
}
=&
。