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();
=&
.