2012-11-14 52 views
3

我有一個DatabaseObject類,它已經選擇,插入,更新和刪除定義的方法。該類的目的是將我的MySQL數據庫中的行的子集表示爲PHP對象。構造函數調用MySQL的SELECT命令,析構函數調用DELETE命令(除非我不問)。如何在PHP類中聲明靜態變量,但是在擴展基類的類中定義它?

這裏是我DatabaseObject類:

class DatabaseObject { 
    protected $table; 
    protected $index_field; 

    private $data; 

    function __construct($id) { 
     //MySQL SELECT and assign resource to data 
    } 

    function __destruct() { 
     //MySQL UPDATE 
    } 

    public function insert($data) { 
     global $db;  //Database Class for using MySQL 

     $fields = array(); 
     $values = array(); 

     foreach ($data as $field => $value) { 
      $fields[] = "`".$field."`"; 
      $values[] = "'".$db->escape($value)."'"; 
     } 

     $sql = "INSERT INTO ".$this->table." (".join(', ', $fields).") VALUES (".join(', ', $values).")"; 
     if($db->query($sql)) { 
      return $db->insertID(); 
     } else { 
      return false; 
     } 
    } 

    //More methods; update(), delete(), select() 
} 

我延長DatabaseObject類時,我想訪問特定的表。例如,我的用戶類是我的用戶表。這裏是:

class User extends Object { 
    public static $anonymous_data = array('user_id' => 0, 'user_level' => ANONYMOUS, 'username' => 'Anonymous'); 

    function __construct($user_id = NULL) { 
     global $db; 
     $this->db = $db; 

     $this->table = USER_TABLE; 
     $this->index_field = 'user_id'; 

     parent::__construct($user_id); 
    } 

    function __destruct() { 
     parent::__destruct(); 
    } 

    //Other user methods; login(), logout() etc. 
} 

現在,我想能夠從用戶類調用插入方法,而沒有實例化用戶類。我很確定,我必須讓它變成靜態的。我如何使插入方法爲靜態,但仍允許它使用擴展類中定義的表?

換句話說,我希望能夠做到這一點:

User::insert($data);  //INSERT into user table 
AnotherClass::insert($data); //INSERT into another table 

...沒有實例或者類。

+0

除非用'insertStatically'之類的不同名稱定義了一個單獨的靜態方法,否則你不能這樣做。 –

+3

讓我指出你完全忽略了使用靜態類調用和'全局變量'編程的* Object Oriented *編程。 [如何不殺死你的測試性使用靜態](http://kunststube.net/static/) – deceze

+1

我認爲你已經粘貼的代碼中有錯誤,class User extends Object {,我認爲它應該是:class用戶擴展DatabaseObject { – m4t1t0

回答

0
<?php 
class Foo { 
    public static $anonymous_data = array(); 

    public static function aStaticMethod() { 
     self::$anonymous_data = array(key, value); 

     foreach (self::$anonymous_data as $key => $value) { 
      echo "$key => $value"; 
     } 
    } 
} 

Foo::aStaticMethod(); 
$classname = 'Foo'; 
$classname::aStaticMethod(); // As of PHP 5.3.0 
?> 

對於靜態方法。但是請注意靜態變量不能以這種方式訪問​​。閱讀關於此示例和靜態關鍵字的更多信息:PHP.net

更新:使用self而不是$this->示例。

+0

另外你在標題中提到了靜態變量,在你提到的問題中,你會談論一個函數/方法/成員什麼是你想稱之爲的。對於變量,對象必須存在。除非你想僅僅創建一個私有/受保護的變量並且設置get/set方法。 – defaultNINJA

+0

也注意到這一點,「我如何使插入方法是靜態的,但仍然允許它使用在擴展類中定義的表?」那麼定義所述表格的對象也必須存在......這將使您可以訪問該方法。 – defaultNINJA

+0

我不認爲這解決了我的問題。我嘗試訪問靜態方法中的$ this-> table_name時出現問題。我得到一個錯誤,說我不能在靜態方法中使用$ this。所以我試着讓$ table_name爲static,但是它不會允許我重寫User類中的$ table_name。 –

相關問題