2012-09-03 75 views
0

我在嘗試在靜態函數中調用CodeIgniter方法時遇到問題,只是使用$這不起作用,因爲它不在對象上下文中,static關鍵字也不起作用。這是我核心模型中代碼的一個例子,$ table變量是從另一個模型(如posts)成功定義的。通過靜態方法使用CodeIgniter庫

class MY_Model extends CI_Model { 

    protected static $table; 

    public function __construct() { 
     parent::__construct(); 
    } 

    public static function find_all() { 
     $this->db->select('*'); 
     $sql = $this->db->get(static::$table); 
     return $sql->result(); 
    } 

} 
+0

您使用的PHP版本是否支持該靜態關鍵字? –

+0

我使用5.4版本,所以是的,我認爲支持它。 –

+0

'$ class = get_called_class(); $ sql = $ this-> db-> get($ class :: $ table);'工作? –

回答

5

如果$這不起作用,你可以解決這個問題是這樣的:

$CI =& get_instance(); 
$CI->db->...
+0

這是如何幫助訪問靜態成員的問題? –

+0

從我的理解克里斯有問題訪問核心CI方法使用$ this例如$ this-> db 如果是這種情況,那麼我的建議可以解決這個問題 – filip

0

你想要的是一個refence在類的靜態無功,所以用:

class MY_Model extends CI_Model { 

    protected static $table; 

    public function __construct() { 
     parent::__construct(); 
    } 

    public static function find_all() { 
     $this->db->select('*'); 
     $sql = $this->db->get(self::$table); 
     return $sql->result(); 
    } 

} 

,當然,$表確實需要有一個價值!

+0

-1:MY_Model應該被擴展,'self :: $ table'返回'MY_Model :: $ table',而不是後期的靜態綁定。 –

+0

我不明白他爲什麼需要遲到靜態綁定?那不是問題! – JvdBerg

+0

*是問題。 –

2

內置Loader類的笨自動實例化的類。沒有實例化就不支持使用類。您可以手動將文件包含在模型文件中,然後您可以使用它。有關更多詳細信息,請查看此主題: http://codeigniter.com/forums/viewthread/73583/

0

Codeigniter通常不支持靜態方法,我相信它們實際上是嘗試將過程代碼強制轉換爲面向對象的代碼。

無論如何,我認爲你最好的選擇是使用沒有靜態方法的類,或者把你的代碼變成一個「幫手」。幫手只是一箇舊式功能庫。你可以在helpers文件夾下創建它,它可以用$ this-> load-> helper('helper_name')加載。然後,您可以調用函數,如在正常的程序代碼,換句話說'find_all()'

希望這會有所幫助。 第一次貢獻者:)