2009-12-10 46 views
2

您如何設計對象可以說您擁有對象用戶和對象access_role。用戶存儲在sql數據庫的users表中,access_role知道user_id並存儲在sql數據庫中。對象設計 - 使用SQL的PHP​​中的用戶和訪問角色

class user() { 

    protected $_name; 
    protected $_id; 
    protected $_age; 
    protected $_password; 

    public function getName(); 
    public function getId(); 
    public function getAge(); 
    public function getPassword(); 

    public function setName(); 
    public function setId(); 
    public function setAge(); 
    public function setPassword(); 

    //sql query 
    public function read(){}; 


    } 

    class accessRole { 

    protected $_accessRole; 
    protected $_userId; 

    public function setAccessRole(); 
    public function setUserId(); 
    public function getAccessRole(); 
    public function getUserId(); 

    } 

如果我想要在sql中執行查詢的用戶的訪問角色。但你如何連接兩個對象,使類似:

$u = new User(); 
$u->getAccessRole(); 

是否行得通呢?

回答

4

我會分開基礎用戶和角色類之間的中介。

$roles = $provider->roles($user); 

這樣class userclass accessRole不必知道對方各自的屬性或任何。 class user可以愉快地生活在沒有訪問角色的情況下,並且class accessRole未綁定到$ _userId。例如。基於一天中的時間,用於訪問角色的用戶名是什麼? (好吧,愚蠢的例子,希望你明白了)。您甚至可以翻譯各種子系統的角色,而無需在整個系統中承擔所有特定(子)角色。

$roles = $provider->convert($rolesBasedOnUser); 

編輯:(希望)簡單的例子....
我用一個簡單的用戶類(沒有進一步的接口或其他類型的抽象的),並沒有角色「下課」,只是一個簡單的字符串數組(爲了簡潔起見)。但請記住,你可以做更多的解耦...如果你喜歡。

class User { 
    protected $id, $name; 
    public function __construct($id) { 
    $this->id = $id; 
    $this->name = 'user #'.$id; 
    } 

    public function getName() { 
    return $this->name; 
    } 
    public function getId() { 
    return $this->id; 
    } 
} 

interface UserRolesProvider { 
    public function roles(User $user); 
} 

現在你可以有一個依賴於用戶類和UserRolesProvider接口代碼,但讓你改變供應商的執行不接觸其他所有的代碼。或者它甚至只依賴角色的集合,讓你隨心所欲地創建/創建/組裝角色。好的,讓我們有兩個(虛擬)提供者接口的實現。

class UserRolesA implements UserRolesProvider { 
    public function roles(User $user) 
    { 
    return 0===$user->getId()%2 ? array() : array('X'); 
    } 
} 

class UserRolesB implements UserRolesProvider { 
    public function roles(User $user) 
    { 
    return 0!==$user->getId()%2 ? array() : array('X'); 
    } 
} 

和一些用戶對象

// "create" 6 users 
$users = array_map(function($x) { return new User($x); }, range(1,6)); 

,並同時使用

function foo($users, UserRolesProvider $provider) { 
    foreach($users as $u) { 
     $roles = $provider->roles($u); 
     echo $u->getName(), ' ', join(',', $roles), " | "; 
    } 
    echo "\n"; 
} 
foo($users, new UserRolesA); 
foo($users, new UserRolesB); 

打印

user #1 X | user #2 | user #3 X | user #4 | user #5 X | user #6 | 
user #1 | user #2 X | user #3 | user #4 X | user #5 | user #6 X | 

沒有太多令人印象深刻的東西。但關鍵是您不必觸摸用戶類或函數foo()中的代碼。
如果你喜歡,解耦可以繼續下去...。
例如一個註冊表,可以回答「我在這裏有一些[類型]。你能給我一些建立角色的東西嗎?「
或者甚至‘你能爲我造一個存根,以便我可以調用FN($角色)爲FN([類型])?’

+0

聽起來interessting,您能詳細解釋一下這種方法嗎? – opHASnoNAME 2009-12-10 07:03:57

+0

貌似這是一個完全德國的討論... ;-) – 2009-12-10 07:27:04

+0

仍然不清楚我( - : – opHASnoNAME 2009-12-10 09:03:46

3

我通常會通過用戶ID和用戶類的構造函數,這個構造函數創建一個本地訪問角色對象:

class user() { 

    protected $accessRole; 

    function __construct($idUser) { 
     $this->accessRole = new accessRole(); 
     $this->accessRole->setUserId($idUser); 
     ... 
    } 

如果初始化訪問角色對象涉及昂貴的操作和我們不這樣做總是需要對象,那麼我們應該找到一種方法來延遲其創建。你怎麼看?

相關問題