giải thích $ CI = & get_instance ();


86

Xem qua mã nguồn của codeigniter,

trong các chức năng trợ giúp của nó, tôi vẫn thấy mã. $CI =& get_instance(); Mọi người có thể vui lòng giải thích cho tôi cách mã này hoạt động không?

Tôi hiểu rằng nó đang trả về một tham chiếu đến siêu đối tượng $ CI, nhưng nó get_instance()đến từ đâu?


Vui lòng đọc stackoverflow.com/a/63914758/2943403 để hiểu tại sao bạn không nên viết =&bất kỳ đâu trong dự án của mình.
mickmackusa

Câu trả lời:


73

Về cơ bản nó là một Mẫu thiết kế Singleton sử dụng một hàm thay vì một phương thức tĩnh.

Để tìm hiểu sâu hơn, hãy xem mã nguồn

Vì vậy, về cơ bản, nó không thực thi singleton, nhưng nó là một phím tắt cho một chức năng công khai ...

Chỉnh sửa: Thực ra, bây giờ tôi đã hiểu. Để có khả năng tương thích với PHP4, họ phải thực hiện một cuộc tấn công kép toàn cục biến để khiến nó trả về các tham chiếu đúng cách. Nếu không, các tài liệu tham khảo sẽ bị xáo trộn. Và vì PHP4 không có hỗ trợ cho các phương thức tĩnh (dù sao thì cũng đúng), nên sử dụng hàm là cách tốt hơn. Vì vậy, nó vẫn tồn tại vì lý do kế thừa ...

Vì vậy, nếu ứng dụng của bạn là PHP5 chỉ, có nên không có gì sai với việc CI_Base::get_instance();thay vào đó, nó giống hệt nhau ...


2
Khi nào sử dụng siêu đối tượng CI và tại sao? Bạn có thể chỉ cho tôi một số tài liệu CI liên quan đến siêu đối tượng CI không?
Girish

1
1 cho thực trỏ đến các THAY THẾ sử dụng cho $CI =& get_instance();tôi đã đập mặt tôi trên Documents tìm kiếm cho rằng ...
HomeOffice

@Bugfixer Khi bạn gặp lỗi 404, vui lòng chỉnh sửa liên kết đó bằng cách sử dụng web.archive.org . Đã làm cho liên kết
Tôi là Hầu hết ngốc Person

20

get_instance () là một hàm được định nghĩa trong các tệp cốt lõi của CodeIgniter. Bạn sử dụng nó để lấy tham chiếu singleton đến siêu đối tượng CodeIgniter khi bạn ở trong phạm vi bên ngoài siêu đối tượng.

Tôi khá chắc chắn rằng nó được định nghĩa trong base.php hoặc một cái gì đó tương tự.


6

Chỉ lớp mở rộng CI_Controller, Model, View mới có thể sử dụng

$this->load->library('something');
$this->load->helper('something');//..etc

Lớp tùy chỉnh của bạn không thể sử dụng mã trên. Để sử dụng các tính năng trên trong lớp tùy chỉnh của bạn, bạn phải sử dụng

$CI=&get instance();
$CI->load->library('something');
$CI->load->helper('something');

ví dụ, trong lớp tùy chỉnh của bạn

// 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

đây là một cấu trúc singleton để hiểu cách bộ mã tải các thư viện và lớp

<?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 (); là thay thế $ this thành $ CI trên trình trợ giúp,


nhưng bạn phải xác định người trợ giúp của mình khi tự động tải [thư viện]
Tofan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.