2013-05-20 65 views
0

我有一個問題,理解使用繼承創建它們的類和子類的最佳實踐。繼承和繼承最佳實踐

比方說,我要實現我的項目

管理員,用戶3類型的用戶和聯繫人

  1. 聯繫這是一個用戶(使用全名,電子郵件,電話,其他聯繫方式)由管理員或用戶創建,他們不能登錄到系統。想象一下,他們只是每個用戶私人電話簿的成員。

  2. 用戶這是一個可以由管理員創建的用戶(同樣具有全名,電子郵件,電話和其他聯繫方式)。他們可以創建聯繫人,但不能創建其他用戶,他們可以登錄到系統。他們也可以(也應該)成爲管理員電話簿的成員。

  3. 管理這是一個用戶(同樣具有全名,電子郵件,電話和其他聯繫方式)。他們可以創建用戶和/或隱形眼鏡及(五言),他們可以登錄到系統中(爲了簡單起見,可以說,這些用戶通過Web形式的submittion創建)

的(簡體)屬性它們是:

聯繫:電子郵件,電話,城市,owner_id,date_in

用戶:電子郵件,電話,城市,owner_id,密碼,date_in

聯繫:電子郵件,電話,城市,密碼,date_in

數據庫表(用戶)是一樣的東西:

  • ID:AUTO_INCREMENT
  • owner_id:由誰這個用戶的ID創建用戶
  • 全稱:文本
  • 電子郵件:文字
  • 電話:文字
  • 城市:text
  • user_type:(Contact ||用戶||管理員)
  • date_in:日期時間,他們簽署了
  • 密碼:(如果適用)

我一個不知道哇,我應該使用繼承...是下面的方案是否正確?

class Contact{ 
} 

class User extends Contact{ 
} 

class Admin extends User{ 
} 

其他一些問題: 應該有管理的方法和用戶可以創建新的用戶(允許其命名爲create_user())。 但是他們每個人都應該進行不同的檢查並允許不同的選項,並向數據庫中插入不同類型的東西。這樣做的最佳做法是什麼?爲父類寫一個泛型並通過子類調用它,然後使用額外數據從子類更新條目? (例如:該管理員還應該將密碼存儲到數據庫中)

UPDATE:也許我還不夠清楚......

有將是通用的方法魚米之鄉,無關的類型用戶,這就是爲什麼我要繼承。我也想要一個共同的數據庫表。

我的主要問題就在這裏,是如何實現需要去不同的東西,如果它會不知常用的方法......例如,這是類「用戶」的user_create()

function user_create($email, $telephone){ 
    dbquery("insert into users ...."); 
    return insert_id(); 
} 

是很好的做法,以實現對管理員同樣的方法是這樣的:

function user_create($email, $telephone, $user_type, $password=''){ 
    $new_id = parent::user_create($email, $telephone); 
    if (user_type == 'User'){ 
    query("UPDATE users SET type='User', password='$password' WHERE id='$new_id'"); 
    } 
    return $new_id; 
} 

回答

0

這看起來不錯,但用戶作爲基類可能會是一個更好的前景,因爲該術語是更通用的,從而更廣泛的應用。

如果您打算使用一組將使用相同方法名稱但不同實現的類,那麼最好使用接口。例如:

Interface User 
{ 
    public function create(); 
} 

class Contact implements User 
{ 
    public function create(){} 
} 

class Admin implements User 
{ 
    public function create(){} 
} 

..等等。

+0

Rijndael,非常感謝! 關於命名。它只是一個命名約定,與實際問題無關,是實現繼承的最佳實踐。 另外使用接口是我知道的事情,而且再次,不是問題的一部分。 無論如何,謝謝阿迦 –

0

我個人會放棄擴展每個類的想法,並有一個接口作爲三者之間的關係。

interface Person 
{ 
    const CONTACT = 1; 
    const USER = 2; 
    const ADMIN = 3; 

    public function get_name(); 
    public function get_mail(); 
    public function get_city(); 
    public function get_role(); 
    ... 
} 

class User implements Person 
{ 
    .... 
} 

class Admin implements Person 
{ 
    .... 
} 

class Contact implements Person 
{ 
    public function get_role() 
    { 
     return Person::CONTACT; 
    } 
    ... 
} 

class John extends Contact 
{ 
    ... 
} 

$john = new John; 
$john->get_city(); 

if($john instanceof Person && $john->get_role() === Person::CONTACT) 
{ 
    ... 
}