อธิบาย $ CI = & get_instance ();


87

มองผ่านซอร์สโค้ดของ codeigniter

ในฟังก์ชั่นตัวช่วยฉันยังคงเห็นรหัส $CI =& get_instance(); ใครก็ได้ช่วยอธิบายให้ฉันฟังว่ารหัสนี้ทำงานอย่างไร

ฉันเข้าใจว่ามันกำลังส่งคืนการอ้างอิงถึง $ CI super object แต่get_instance()มาจากไหน?


โปรดอ่านstackoverflow.com/a/63914758/2943403เพื่อทำความเข้าใจว่าเหตุใดคุณจึงไม่ควรเขียน=&ที่ใดก็ได้ในโครงการของคุณ
mickmackusa

คำตอบ:


73

โดยพื้นฐานแล้วเป็นรูปแบบการออกแบบ Singletonที่ใช้ฟังก์ชันแทนวิธีการคงที่

หากต้องการดูรายละเอียดให้ตรวจสอบซอร์สโค้ด

โดยพื้นฐานแล้วมันไม่ได้บังคับใช้ซิงเกิลตัน แต่เป็นทางลัดไปยังฟังก์ชันสาธารณะ ...

แก้ไข: ที่จริงตอนนี้ฉันเข้าใจแล้ว สำหรับความเข้ากันได้ของ PHP4 พวกเขาต้องทำการแฮ็กแบบdouble-global-variable-hackเพื่อให้ส่งคืนการอ้างอิงอย่างถูกต้อง มิฉะนั้นการอ้างอิงจะทำให้เสียหายทั้งหมด และเนื่องจาก PHP4 ไม่รองรับวิธีการแบบคงที่ (ยังไงก็ตาม) การใช้ฟังก์ชันจึงเป็นวิธีที่ดีกว่า ดังนั้นจึงยังคงมีอยู่ด้วยเหตุผลทางมรดก ...

ดังนั้นหากแอปของคุณเป็น PHP5 เท่านั้นไม่น่าจะมีอะไรผิดปกติในการทำCI_Base::get_instance();แทนมันเหมือนกัน ...


2
เมื่อใดควรใช้ CI super object และเพราะเหตุใด คุณช่วยชี้ให้ฉันดูเอกสาร CI เกี่ยวกับ CI super object ได้ไหม
Girish

1
+1 สำหรับการชี้ไปที่การใช้งานREPLACEMENTจริง ๆเพราะ$CI =& get_instance();ฉันกำลังเผชิญหน้ากับเอกสารเพื่อค้นหาสิ่งนั้น ...
HomeOffice

@Bugfixer เมื่อคุณเห็นว่าข้อผิดพลาด 404 โปรดแก้ไขการเชื่อมโยงโดยใช้web.archive.org ทำไปแล้วสำหรับลิงค์นั้น
ฉันเป็นคนโง่ที่สุด

20

get_instance () เป็นฟังก์ชันที่กำหนดไว้ในไฟล์หลักของ CodeIgniter คุณใช้เพื่อรับการอ้างอิงซิงเกิลตันไปยังอ็อบเจ็กต์ CodeIgniter เมื่อคุณอยู่ในขอบเขตนอกซูเปอร์อ็อบเจ็กต์

ฉันค่อนข้างแน่ใจว่ามันถูกกำหนดใน base.php หรืออะไรที่คล้ายกัน


7

เฉพาะคลาสที่ขยาย 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.