มองผ่านซอร์สโค้ดของ codeigniter
ในฟังก์ชั่นตัวช่วยฉันยังคงเห็นรหัส
$CI =& get_instance();
ใครก็ได้ช่วยอธิบายให้ฉันฟังว่ารหัสนี้ทำงานอย่างไร
ฉันเข้าใจว่ามันกำลังส่งคืนการอ้างอิงถึง $ CI super object แต่get_instance()
มาจากไหน?
มองผ่านซอร์สโค้ดของ codeigniter
ในฟังก์ชั่นตัวช่วยฉันยังคงเห็นรหัส
$CI =& get_instance();
ใครก็ได้ช่วยอธิบายให้ฉันฟังว่ารหัสนี้ทำงานอย่างไร
ฉันเข้าใจว่ามันกำลังส่งคืนการอ้างอิงถึง $ CI super object แต่get_instance()
มาจากไหน?
คำตอบ:
โดยพื้นฐานแล้วเป็นรูปแบบการออกแบบ Singletonที่ใช้ฟังก์ชันแทนวิธีการคงที่
หากต้องการดูรายละเอียดให้ตรวจสอบซอร์สโค้ด
โดยพื้นฐานแล้วมันไม่ได้บังคับใช้ซิงเกิลตัน แต่เป็นทางลัดไปยังฟังก์ชันสาธารณะ ...
แก้ไข: ที่จริงตอนนี้ฉันเข้าใจแล้ว สำหรับความเข้ากันได้ของ PHP4 พวกเขาต้องทำการแฮ็กแบบdouble-global-variable-hackเพื่อให้ส่งคืนการอ้างอิงอย่างถูกต้อง มิฉะนั้นการอ้างอิงจะทำให้เสียหายทั้งหมด และเนื่องจาก PHP4 ไม่รองรับวิธีการแบบคงที่ (ยังไงก็ตาม) การใช้ฟังก์ชันจึงเป็นวิธีที่ดีกว่า ดังนั้นจึงยังคงมีอยู่ด้วยเหตุผลทางมรดก ...
ดังนั้นหากแอปของคุณเป็น PHP5 เท่านั้นไม่น่าจะมีอะไรผิดปกติในการทำCI_Base::get_instance();
แทนมันเหมือนกัน ...
$CI =& get_instance();
ฉันกำลังเผชิญหน้ากับเอกสารเพื่อค้นหาสิ่งนั้น ...
get_instance () เป็นฟังก์ชันที่กำหนดไว้ในไฟล์หลักของ CodeIgniter คุณใช้เพื่อรับการอ้างอิงซิงเกิลตันไปยังอ็อบเจ็กต์ CodeIgniter เมื่อคุณอยู่ในขอบเขตนอกซูเปอร์อ็อบเจ็กต์
ฉันค่อนข้างแน่ใจว่ามันถูกกำหนดใน base.php หรืออะไรที่คล้ายกัน
เฉพาะคลาสที่ขยาย 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.
นี่คือโครงสร้างซิงเกิลตันเพื่อทำความเข้าใจว่า 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();
$ CI = get_instance (); คือการแทนที่ $ this เป็น $ CI ในตัวช่วย
วางไว้ในตัวสร้างได้ผลสำหรับฉัน:
function __construct()
{
$this->CI =& get_instance();
}
=&
ที่ใดก็ได้ในโครงการของคุณ