$ CI = & get_instance ();


87

Codeigniter'in kaynak koduna bakmak,

yardımcı işlevlerinde kodu görmeye devam ediyorum $CI =& get_instance(); , lütfen biri bana bu kodun nasıl çalıştığını açıklayabilir mi?

$ CI süper nesnesine bir referans döndürdüğünü anlıyorum, ama nereden get_instance()geliyor?


Projenizde neden hiçbir yere yazmamanız gerektiğini anlamak için lütfen stackoverflow.com/a/63914758/2943403=& adresini okuyun.
mickmackusa

Yanıtlar:


73

Temelde , statik bir yöntem yerine bir işlev kullanan bir Singleton Tasarım Modeli .

Daha derinlemesine bakmak için kaynak koduna bakın

Yani temelde, tekliyi zorlamıyor, ancak bir genel işlevin kısayolu ...

Düzenleme: Aslında, şimdi anlıyorum. PHP4 uyumluluğu için, referansları düzgün bir şekilde döndürmesini sağlamak için bir çift ​​küresel değişken hacklemesi yapmak zorunda kaldılar. Aksi takdirde referanslar her şeyi mahveder. Ve PHP4 statik metotları desteklemediğinden (yine de düzgün bir şekilde), fonksiyonu kullanmak daha iyi bir yoldu. Yani eski nedenlerden dolayı hala var ...

Yani uygulamanız yalnızca PHP5 ise , bunun yerine yapmakta yanlış bir şey olmamalıdırCI_Base::get_instance(); , aynıdır ...


2
CI süper nesnesi ne zaman ve neden kullanılır? Beni CI süper nesnesi ile ilgili bazı CI belgelerine yönlendirebilir misiniz?
Girish

1
Bunu arayan Dokümanlar'da yüzüme vurduğum için DEĞİŞTİRME kullanımına işaret eden +1 $CI =& get_instance();...
HomeOffice

@Bugfixer Bu 404 hatasını gördüğünüzde lütfen web.archive.org kullanarak bu bağlantıyı düzenleyin . Bu bağlantı için çoktan yaptım
Ben En Aptal

20

get_instance (), CodeIgniter'ın çekirdek dosyalarında tanımlanan bir işlevdir. Süper nesnenin dışında bir kapsamdayken CodeIgniter süper nesnesine tekil referans almak için kullanırsınız.

Base.php veya benzeri bir yerde tanımlandığından oldukça eminim.


7

Yalnızca CI_Controller, Model, View'ı genişleten sınıf kullanabilir

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

Özel Sınıfınız yukarıdaki kodu kullanamaz. Yukarıdaki özellikleri özel sınıfınızda kullanmak için şunları kullanmanız gerekir:

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

örneğin, özel sınıfınızda

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

Bu, kod işaretleyicinin kitaplıkları ve sınıfları nasıl yüklediğini anlamak için tekli bir yapıdır

<?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, yardımcının $ CI olarak değiştirilmesi,


ancak yardımcınızı autoload [kütüphane] 'de tanımlamalısınız
Tofan

0

Yapıcıya koymak benim için çalıştı:

function __construct()
{
$this->CI =& get_instance();
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.