sourcecode

$CI = & get_sublic(); 설명

copyscript 2022. 9. 21. 23:26
반응형

$CI = & get_sublic(); 설명

코드 시그너의 소스코드를 보면

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

$CI 슈퍼오브젝트에 대한 참조를 반환하고 있는 것은 알고 있습니다만, 어디에 있습니까?get_instance()어디서 왔나요?

기본적으로 정적 방식이 아닌 함수를 사용하는 싱글톤 디자인 패턴입니다.

자세히 알아보려면 소스 코드를 확인하십시오.

그러니까 기본적으로 독신자를 강제하지는 않지만 공공장소로 가는 지름길이야

편집: 사실 이제 이해했습니다.PHP4 호환성을 위해 참조를 올바르게 반환하기 위해 double-global-variable-hack을 실행해야 했습니다.그렇지 않으면 레퍼런스가 엉망이 될 것이다.그리고 PHP4는 정적 메서드를 지원하지 않기 때문에(어쨌든) 함수를 사용하는 것이 더 나은 방법입니다.그래서 여전히 존재하는 이유는...

따라서 만약 당신의 앱이 PHP5만이라면, 그것을 하는 것에 아무런 문제가 없을 것이다.CI_Base::get_instance();대신 똑같아...

get_instance()는 CodeIgniter의 핵심 파일에 정의되어 있는 함수입니다.슈퍼 오브젝트 외부에 있는 스코프에 있는 경우 CodeIgniter 슈퍼 오브젝트에 대한 싱글톤 참조를 취득하기 위해 사용합니다.

기지에 정의되어 있는 게 확실해요php 또는 이와 유사한 것입니다.

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.

코드 시그너가 라이브러리와 클래스를 로드하는 방법을 이해하기 위한 싱글톤 구조입니다.

<?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 = get_buffic();는 도우미 상에서 $this를 $CI로 대체하는 것입니다.

건설업자에 넣는 것은 나에게 효과가 있었다.

function __construct()
{
$this->CI =& get_instance();
}

언급URL : https://stackoverflow.com/questions/4740430/explain-ci-get-instance

반응형