使用場景:
注意 get_instance 的使用場景,這個方法並不是用在控制器中的。
而是用在控制器外面,比如類庫中,想操作 CI 超級對象的時候,超級對象實際上就是當前控制器的實例。
你隨便下個CI框架的源碼都會看到很多的get_instance() 函數,這個函數是用來獲取CI 的全局超級對象,CI 是單例模式的框架,所有全局有一個超級對象。因為只有一個實例,所以無論這個函數使用多少次都不會消耗資源的。一般來說,只有在helper或library中才使用get_instance。
以前我們都是這樣用的:$this->load->library('session');
$this只作用在你自己的控制器、模型、視圖中,如果你在自定義的類中也想使用CI的函數話,你就可以這樣做:
//通過引用的方式賦給變量將使用原始的 CodeIgniter 對象
$ci = &get_instance();
//這樣就可以使用ci的函數了
$ci->load->library('session');
要你自定義的類庫中訪問CodeIgniter的原始資源,你必須使用 get_instance() 函數.這個函數返回一個CodeIgniter super object.
一般來說在你的控制器函數中你可以通過 $this 調用任何可用的CodeIgniter函數:
$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
etc.
$this, 只直接作用在你自己的控制器,模型和視圖中.當你在自定義類中想使用CodeIgniter原始類時,你可以這樣做:
首先,定義CodeIgniter對象賦給一個變量:
$CI =& get_instance();
一旦定義某個對象為一個變量,你就可以使用那個變量名 取代 $this:
$CI =& get_instance();
$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
etc.
注意: 你將注意到get_instance()這個函數通過被引用的方式被傳遞:
$CI =& get_instance();
這十分重要. 通過引用的方式賦給變量將使使用原始的CodeIgniter對象,而不是創建一個拷貝
同時,請注意: 如果你使用php 4,那么請最好不要在類的構造函數中調用 get_instance() .php4在引用位於構造函數中的CI super object時存在問題,因為對象只有在類完全實例化后才存在.
對於"CI官方手冊說調用get_instance()函數時,要用&引用符號;原因是為了防止對象生成副本"這一句里面的"防止對象生成副本",類比Unix中的硬鏈接、軟鏈接,是不是就是防止生成軟鏈接,就像windows中的,只生成某個軟件的啟動exe的別名,而不要發送或復制快捷方式到其他地方而產生快捷方式的復制?