如何正确设计这些类?

时间:2010-11-22 00:00:21

标签: php oop

我想知道如何解决这个问题。我有一个类User.class.php类似

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页面,因此用户必须登录才能使用此方法。请注意__construct(PDO $db, $username)

所以我有另一个页面members.php,它会显示一个用户列表。将有人未登录访问此页面,因此无法使用User.class因此我正在考虑创建另一个名为Members.class的类,但问题是它将具有来自User.class <的重复内容/ p>

我应该为登录用户User.classMember.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

显示成员列表。访问者可能没有登录,因此我会在尝试实例化User类时遇到错误,因为没有会话

<?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>

4 个答案:

答案 0 :(得分:3)

  

此类用于用户profile.php页面,因此用户必须登录才能使其正常工作。

这是您希望用户类做的吗?您是否希望仅在登录时创建用户类的实例,或者该类是否应表示该用户对该站点的记录?恕我直言user应该是一个代表用户的类,可以用于其他类所需的任何目的。 Profile.php只能显示用户的数据,无需使用户类专门习惯于profile.php

  

我是否应该有登录用户的User.class和查看其他用户的Member.class?

如果members.php是用于显示用户的页面,则似乎应该使用用户类来执行此操作,而不是作为其自己的单独数据实体。是不是用户的成员,因为一个用户登录而一个不是?这似乎与“现实世界”并不匹配。登录是用户的状态,可以通过登录用户列表轻松维护。

  

或者我应该重新设计User.class以允许两者?

如果你必须重新设计用户以允许两者,那么也许用户有太多的责任,应该简化。该类应包含用户的信息,并有一些基本方法供其他类使用,而不是自己做所有事情。应该很容易获得用户类的实例列表(或其ID或特定用户的某些表示),以便您查看当前在线的用户的信息。

答案 1 :(得分:1)

另一种解决方案是让会员继承用户

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

这样你就可以考虑另一堂课“嘉宾”

答案 2 :(得分:1)

根据您的编辑,您似乎不应该使用多个类来执行您正在执行的操作,因为它代表逻辑用户实体。

为什么要尝试在User中实例化members.php的实例(将其分配给$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以检索要显示的完整用户列表。

答案 3 :(得分: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
}