$ CI = & get_instance () की व्याख्या करें;


86

Codeigniter के स्रोत कोड के माध्यम से देख रहे हैं,

अपने सहायक कार्यों में मैं कोड देखता रह $CI =& get_instance(); सकता हूं, क्या कोई मुझे यह समझा सकता है कि यह कोड कैसे काम करता है?

मुझे लगता है कि यह $ CI सुपर ऑब्जेक्ट का संदर्भ दे रहा है, लेकिन यह कहां get_instance()से आता है?


कृपया यह समझने के लिए कि आपको अपने प्रोजेक्ट में कहीं भी क्यों नहीं लिखना चाहिए, कृपया stackoverflow.com/a/63914758/2943403 पढ़ें =&
मिकमैकुसा

जवाबों:


73

यह मूल रूप से एक सिंगलटन डिज़ाइन पैटर्न है जो एक स्थिर विधि के बजाय एक फ़ंक्शन का उपयोग करता है।

गहराई से देखने के लिए, स्रोत कोड देखें

तो मूल रूप से, यह सिंगलटन लागू नहीं करता है, लेकिन यह एक सार्वजनिक समारोह का एक शॉर्टकट है ...

संपादित करें: वास्तव में, अब मुझे समझ में आया। PHP4 संगतता के लिए उन्हें संदर्भों को ठीक से वापस करने के लिए डबल-ग्लोबल-वैरिएबल-हैक करना पड़ा । अन्यथा संदर्भ सभी खराब हो जाते। और चूंकि PHP4 में स्टैटिक मेथड्स के लिए सपोर्ट नहीं था (अच्छी तरह से, वैसे भी), फंक्शन का उपयोग करना बेहतर तरीका था। तो यह अभी भी विरासत कारणों से मौजूद है ...

इसलिए यदि आपका ऐप केवल PHP5 है, तो इसके बजाय कुछ भी गलत नहीं होना चाहिएCI_Base::get_instance(); , यह समान है ...


2
सीआई सुपर ऑब्जेक्ट का उपयोग कब और क्यों करना है? क्या आप मुझे सीआई सुपर ऑब्जेक्ट के बारे में कुछ सीआई प्रलेखन की ओर इशारा कर सकते हैं?
गिरीश

1
+1 वास्तव में REPLACEMENT के उपयोग की ओर इशारा करने के लिए $CI =& get_instance();मैं डॉक्स की तलाश में अपना चेहरा पीट रहा था ...
HomeOffice

@Bugfixer जब आप देखते हैं कि 404 त्रुटि कृपया web.archive.org का उपयोग करके उस लिंक को संपादित करें । उस लिंक के लिए पहले से ही किया गया
मैं

20

get_instance () CodeIgniter की मूल फाइलों में परिभाषित एक फ़ंक्शन है। जब आप सुपर ऑब्जेक्ट के बाहर एक दायरे में होते हैं, तो आप इसका उपयोग कोडआईग्निटर सुपर ऑब्जेक्ट के लिए सिंगलटन संदर्भ प्राप्त करने के लिए करते हैं।

मुझे पूरा यकीन है कि यह base.php या कुछ इसी तरह से परिभाषित है।


6

केवल वह वर्ग जो CI_Controller, मॉडल, व्यू का विस्तार करता है

$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

यह समझने के लिए एक सिंगलटन संरचना है कि कैसे कोडाइनिटर पुस्तकालयों और कक्षाओं को लोड करता है

<?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();

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.