我試圖創建php類,它將處理與我的數據庫的所有交互。在這一點上,每個類代表我的數據庫中的一個表,我想創建一個接口或類來擴展,其中包含所有表共享的方法。使用默認方法的接口PHP
public static function find_by_sql($sql){
global $database;
$response = $database->query($sql);
$object_array = array();
while($next = $database->fetch_array($response)){
$object_array[] = self::instantiate($next);
}
return !empty($object_array) ? $object_array : false;
}
private static function instantiate($result_array){
$object = new static;
foreach($result_array as $attribute=>$value){
if($object->has_attribute($attribute)){
$object->$attribute = $value;
}
}
return $object;
}
我的問題是實例化方法需要與它的子類的屬性進行交互。我習慣於使用java來處理接口中的抽象getter和setter方法以及缺省方法來完成此操作。有什麼類似的我可以在PHP中做什麼?
採取這一小一步我也希望能夠包括下面的方法:
public static function find_by_id($id){
$sql = "SELECT * FROM users WHERE id=\"{$id}\" LIMIT 1";
$result_array = parent::find_by_sql($sql);
return !empty($result_array) ? array_shift($result_array) : false;
}
我來自哪裏這是可以通過PHP的實現方法或其他函數調用獲取表名如get_class()函數。
使用'abstract'類。這是一個普通的類,不能用'new'關鍵字自己'實例化'。您也可以使用標準類並從中擴展。取決於你想完成什麼。 「接口」只是一種定義需要存在的「元」信息,但它本身沒有任何方法實現。 –
這個解決方案的唯一問題是,我無法從正在擴展抽象類的類靜態調用find_by_sql(),因此在'instantiate()'中使用'static'不再有效。 – user2789116
也許[traits](http://php.net/manual/en/language.oop5.traits.php)? – Alex