我有一個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
...沒有實例或者類。
除非用'insertStatically'之類的不同名稱定義了一個單獨的靜態方法,否則你不能這樣做。 –
讓我指出你完全忽略了使用靜態類調用和'全局變量'編程的* Object Oriented *編程。 [如何不殺死你的測試性使用靜態](http://kunststube.net/static/) – deceze
我認爲你已經粘貼的代碼中有錯誤,class User extends Object {,我認爲它應該是:class用戶擴展DatabaseObject { – m4t1t0