我正在为用户创建个人资料页面(就像此论坛中的那个)。
我有一个这样的课程
class User
{
private $db;
private $name;
private $location;
private $email;
private $age;
private $photo;
function __construct($player_id, DB $db)
{
$this->db = $db;
$stm = $this->db->prepare_and_execute(
'SELECT * from users
where id = ?',
$_SESSION['user_id']
);
$result = $stm->fetch();
$this->email = $result['email'];
$stm = $this->db->prepare_and_execute(
'SELECT * from user_details
where user_id = ?',
$_SESSION['user_id']
);
$result = $stm->fetch();
$this->name = $result['name'];
$this->age = $result['age'];
$this->photo = $result['photo'];
}
public function get_player_name()
{
return $this->name;
}
public function get_player_location()
{
return $this->location;
}
public function get_player_age()
{
return $this->age;
}
// and so on...
}
在我的profile.php页面中显示用户的详细信息,我有类似的内容:
<?php
$user = new User($_SESSION['user_id'], $db);
?>
<table id="info_table">
<tr>
<td class="td-align-top">Info</td>
<td class="td-align-top">
<table>
<tr><td>Location</td></tr>
<tr><td>Age</td></tr>
<?php if ($user->is_own_profile()) {
// check whether the user is viewing
//is his own profile or another user's profile ?>
<tr><td>Email</td></tr>
<?php } ?>
<tr><td>Organization</td></tr>
</table>
</td>
<td class="td-align-top">
<table>
<tr><td><?php echo $player->get_player_location(); ?></td></tr>
<tr><td><?php echo $player->get_player_age(); ?></td></tr>
<?php if ($user->is_own_profile()) { ?>
<tr><td><?php echo $player->get_player_email(); ?></td></tr>
<?php } ?>
<tr><td><?php echo $player->get_player_organization(); ?></td></tr>
</table>
</td>
</tr>
</table>
所以我有两个问题:
正如您所看到的,我正在使用名为is_own_profile()的函数来检查用户是否正在查看自己的个人资料,或者他是否在某些其他用户个人资料中,并根据该条件的结果,我隐藏/显示电子邮件地址。现在你可以想象我将不得不使用相同的if-else条件来决定是否在页面上显示或隐藏很多其他东西,比如bith的日期,编辑选项等等。而不是有这个if-else结构在整个页面上有更清洁的方法吗?
在profile.php页面的开头,我正在创建一个用户对象,并用db中的一些数据填充它。现在,我如何在其他页面中提供此对象,如通知,消息等,而不是在每个页面上实例化和填充对象。我已经考虑过把对象放在一个会话中但是在这个论坛中经过一些答案之后我意识到最好避免在会话中放入过多的数据。那么解决这个问题的最佳方法是什么?
谢谢..
答案 0 :(得分:2)
如果您不想将其保存在会话中,您可以只创建一个包含文件并在那里进行实例化。这样,如果你需要在每个页面上做任何其他事情,你只需要在那里添加它。
另外,对于你的if-else,你可以做类似以下的事情:
$player->show_own('email', '<tr><td>', '</td></tr>');
其中get_player_email
看起来像这样:
public function show_own($prop, $before = '', $after = '')
{
if ( $this->is_own_profile() ) {
return $before . $this->$prop . $after;
}
return '';
}
然后您也可以将该方法重用于其他属性。