2010-11-22 16 views
2

私はこれについてどうやって行くのか不思議です。私はこのこれらのクラスを正しく設計する方法は?

class User { 
     protected $db; 
     protected $username; 
     protected $userid; 
     protected $firstName; 
     protected $lastName; 

     public function __construct(PDO $db, $username){ 
     } 

     public function editProfile($userDetails){ 
     } 

     //getter and setters 
} 

ユーザーが仕事に、このためにはログインする必要がありますので、このクラスは、ユーザーprofile.phpページのために使用されているようなものだクラスUser.class.phpを持っています。通知__construct(PDO $db, $username)

他のページmembers.phpには、ユーザーの一覧が表示されます。このページを訪問してログインしていません人のでUser.classMembers.classと呼ばれる別のクラスの作成についてとてもイム思考を使用することはできませんが、事は、私がログインユーザーのためのUser.classを持っているなら、それはUser.class

からコンテンツを複製していますですがあります他のユーザーを表示するにはMember.class?または、両方を可能にするためにUser.classを再設計する必要がありますか?私はこのソリューションがシンプルになる可能性があることを知っていますが、私の限られた経験のおかげで、どちらがより良い方法であるかを知りたいですか?

を編集してくださいと感謝:私は

profile.php 

はログインする必要があります...もっと説明します

<?php 
//Instantiate User 
$user = new User($db, $session->get('username')); 
?> 
<html> 
<body> 
     <strong>My Profile</strong> 
     <?php echo $user->firstName(); ?><br /> 
     <?php echo $user->lastName(); ?><br /> 
     <a href="editprofile">Edit Profile</a> 
</body> 

members.php 

のリストを表示します。メンバー。ビジターは、ログインすることはできませんし、何のセッション

<?php 
//Instantiate User 
$user = new User($db, $session->get('username')); 
?> 
<html> 
<body> 
    <?php 
     //FOR LOOP to loop through users from database 
     //echo users firstname and lastname 
    ?> 
</body> 
</html> 
+1

このクラスはユーザーエンティティ自体を表すのでしょうか、それともあなたが言及している 'profile.php'ページを表していますか? –

+0

@this私の質問を編集しました – Jonathan

答えて

1

は別の解決策は、メンバーユーザーを継承させることであろうがないので、このため私は、ユーザーのクラスをインスタンス化しようとするとエラーが発生します。

class User { 
    // Common methods and propertis 
} 
class Member extends User { 
    // Special member stuff 
} 

あなたが別のクラスを考えることができるこの方法は、「ゲスト」

3

ユーザーはこれが機能するためにはログインする必要がありますので、このクラスは、ユーザーprofile.phpページに使用されます。

これはあなたのユーザークラスにしてもらいたいことですか?ユーザークラスのインスタンスをログイン時にのみ作成するか、そのクラスがそのユーザーのレコードをサイトで表現する必要がありますか? IMHO userは、他のクラスで必要な目的に使用できるユーザーを表すクラスである必要があります。 Profile.phpは、ユーザーのデータを表示するだけで、特にprofile.phpに慣れているユーザークラスを作成する必要はありません

ログインユーザー用のUser.classと他のユーザー用のMember.class ?

members.phpがユーザーを表示するページである場合、独自の別個のデータエンティティではなくユーザークラスを使用する必要があるようです。メンバーは、ログインしていて、ログインしていないユーザーと異なるのですか?これは「現実の世界」と密接にマッチするようには見えません。ログインしているのはユーザの状態です。ログインしているユーザのリストを持つことで簡単に管理できます。

または両方を許可するようにUser.classを再設計する必要がありますか?

ユーザーが両方を許可するようにユーザーを再設計する必要がある場合は、多分ユーザーの責任が大きくなり、単純化する必要があります。クラスにはユーザーの情報が含まれていて、他のクラスでの使用のためのいくつかの基本的な方法があります。現在オンラインになっているユーザーの情報を表示できるように、ユーザークラスのインスタンス(またはIDまたは特定のユーザーの表現)のリストを簡単に作成する必要があります。

1

あなたの編集に基づいて、論理ユーザーエンティティを表しているので、あなたがやっていることに対して複数のクラスを使うべきではないようです。

members.phpUserのインスタンスをインスタンス化しようとしています($userに割り当てます)。このユーザーは、ログインしているユーザーがいなければ、論理的にどのようなユーザーに対応していますか?あなたはそれで何をしたいですか?

それはあなたが望むもののように思えるが、このようなものである。この場合

<?php 

$users = User::getUsers(); // Or something similar. 

?> 
<html> 
<body> 
<?php 

foreach ($users as $user) 
{ 
    // Display the user; for example: 
    echo $user->name . '<br />'; 
} 

?> 
</body> 
</html> 

、あなたが表示するために、ユーザーの完全なリストを取得するには、静的メソッドUser::getUsersを実装すると思います。

+0

たとえば、誰かがゲスト用のショッピングカートを持ちたいとします。次に、別のクラスが便利です。 – KingCrunch

+0

@ KingCrunch:確かに、このようなシナリオについては言及されていません。そのようなことが必要な場合は、 'Guest'クラスが賢明ですが、そうでなければ、それは必要ありません。 –

+0

あなたは正しいです。私のコメントはあなたの文章に対する答えに過ぎませんでした。 "あなたはそれをどうしたいですか?"下の私の答えで見ることができるように、私はゲストクラスも省略しますが、後で見つけた場合は、そのようなクラスが必要です。 – KingCrunch

1

ユーザーモデルとログイン/セッションロジックを分離する必要があります。 認証を処理するUserSessionを作成し、必要に応じてセッションに ユーザーデータを格納します。


class User { 
    // has credentials and other information 
} 

class UserSession { 
    //login will only be used when the user logs in 
    function login(User $user){} 
    function isLoggedIn(){} 
    //either the username from User or guest/anon if not logged in 
    function getUsername(){} 
} 

if ($userSession->isLoggedIn()){ 
    // allow access to profile.php 
} 
+0

これは面白そうです。だから、内部関数のログイン(ユーザー$ユーザー){}セッションクラスをインスタンス化しますか? – Jonathan

+0

私は通常、一般化されたセッションクラスを避け、特殊クラス(UserSession)内で$ _SESSIONに直接アクセスするコードを埋め込みます。それでも使用したい場合は、コンストラクタに渡すことをお勧めします。 – c0rnh0li0

関連する問題