我想知道如何解决这个问题。我有一个类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.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
显示成员列表。访问者可能没有登录,因此我会在尝试实例化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>
答案 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
}