пояснити $ CI = & get_instance ();


86

Переглядаючи вихідний код codeigniter,

у його допоміжних функціях я продовжую бачити код, чи $CI =& get_instance(); може хто-небудь пояснити мені, як працює цей код?

Я розумію, що він повертає посилання на супер-об'єкт $ CI, але звідки це береться get_instance()?


Будь ласка, прочитайте stackoverflow.com/a/63914758/2943403, щоб зрозуміти, чому вам не слід писати =&ніде у своєму проекті.
mickmackusa

Відповіді:


73

В основному це шаблон дизайну Singleton, який використовує функцію замість статичного методу.

Щоб глибше заглянути, перевірте вихідний код

Отже, в основному він не застосовує синглтон, але це ярлик для публічної функції ...

Редагувати: Власне, тепер я розумію. Для сумісності з PHP4 їм довелося зробити подвійну глобальну змінну-хак, щоб він повернув посилання належним чином. Інакше посилання все б зіпсували. І оскільки PHP4 не підтримував статичних методів (ну, як би там не було), використання функції було кращим способом. Отже, він все ще існує із застарілих причин ...

Отже, якщо ваш додаток лише PHP5, замість цього не повинно бути нічого поганого CI_Base::get_instance();, він ідентичний ...


2
Коли використовувати супер об'єкт CI і чому? Чи можете ви вказати мені якусь документацію CI щодо супер об’єкта CI?
Girish

1
+1 за те, що фактично вказав на використання ЗАМІНИ, оскільки $CI =& get_instance();я стукав обличчям у Документи, шукаючи це ...
HomeOffice

@Bugfixer Коли ви побачите цю помилку 404, будь ласка, відредагуйте це посилання за допомогою web.archive.org . Для цього посилання вже зроблено
я

20

get_instance () - це функція, визначена в основних файлах CodeIgniter. Ви використовуєте його, щоб отримати посилання на синглтон на супер об’єкт CodeIgniter, коли ви перебуваєте в області дії поза супер об’єктом.

Я майже впевнений, що це визначено в base.php або щось подібне.


6

Можна використовувати лише клас, який розширює 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 у помічнику,


але ви повинні визначити свого помічника при автозавантаженні [бібліотека]
Тофан,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.