설명 $ CI = & get_instance ();


86

codeigniter의 소스 코드를 살펴보면,

도우미 기능에서 계속 코드 $CI =& get_instance(); 를 볼 수 있습니다.이 코드가 어떻게 작동하는지 설명해 주시겠습니까?

$ CI 수퍼 객체에 대한 참조를 반환한다는 것을 알지만 어디에서 get_instance()왔습니까?


프로젝트의 어디에도 쓰면 안되는 이유를 이해하려면 stackoverflow.com/a/63914758/2943403 을 읽어보십시오 =&.
mickmackusa

답변:


73

기본적으로 정적 메서드 대신 함수를 사용 하는 싱글 톤 디자인 패턴 입니다.

더 자세히 알아 보려면 소스 코드를 확인하세요.

따라서 기본적으로 싱글 톤을 적용하지는 않지만 공용 기능의 지름길입니다.

편집 : 사실, 이제 이해합니다. PHP4 호환성을 위해 그들은 참조를 올바르게 반환하기 위해 double-global-variable-hack 을해야했습니다. 그렇지 않으면 참조가 모두 망가질 것입니다. 그리고 PHP4는 정적 메서드를 지원하지 않았기 때문에 (어쨌든 적절하게) 함수를 사용하는 것이 더 좋은 방법이었습니다. 그래서 그것은 유산 이유로 여전히 존재합니다 ...

따라서 앱이 PHP5 전용 인 경우 대신 수행하는 데 아무런 문제 가 없어야 합니다. CI_Base::get_instance();동일합니다.


2
CI 수퍼 오브젝트를 사용하는시기와 이유는 무엇입니까? CI 수퍼 객체에 관한 CI 문서를 알려줄 수 있습니까?
Girish

1
실제로 대체 사용법을 가리키는 +1 $CI =& get_instance();은 문서에서 내 얼굴을 두드리는 중이었습니다 ...
HomeOffice

@Bugfixer 당신은 404 오류하시기 바랍니다 편집 링크를 사용하는 것을 볼 때 web.archive.org을 . 이미 해당 링크에 대한 수행
내가 가장 어리석은 사람이다

20

get_instance ()는 CodeIgniter의 핵심 파일에 정의 된 함수입니다. 수퍼 객체 외부의 범위에있을 때 CodeIgniter 수퍼 객체에 대한 싱글 톤 참조를 가져 오는 데 사용합니다.

나는 그것이 base.php 또는 비슷한 것으로 정의되어 있다고 확신합니다.


6

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.

4

이것은 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();

1

$ CI = get_instance (); 도우미에서 $ this를 $ CI로 바꾸는 것입니다.


하지만 당신은 자동로드에 대한 정의 도우미를해야합니다 [라이브러리]
Tofan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.