2013-07-06 6 views
0

Я создаю страницу профиля для пользователя (точно так же, как в этом форуме).Создание профиля пользователя с помощью OOP PHP

У меня есть класс, как этот

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> 

Так у меня есть 2 вопроса :

  1. Как вы можете видеть, я использую функцию с именем is_own_profile(), чтобы проверить, является ли пользователь viewi его собственный профиль, или он находится в другом профиле пользователей и на основании результата этого условия я скрываю/показываю адрес электронной почты. Теперь, как вы можете себе представить, мне придется использовать одно и то же условие if-else, чтобы решить, показывать или скрыть много других вещей на странице, например, дату бит, параметр «Редактировать» и т. Д. Вместо того, чтобы иметь эти конструкции if-else на всей странице есть более чистый способ сделать это?

  2. В начале страницы profile.php, я создаю объект пользователя и заполняю его некоторыми данными из db. Теперь, как я могу сделать этот объект доступным на других страницах, таких как уведомления, сообщения и т. Д. Вместо того, чтобы создавать и заполнять объект на каждой странице. Я рассмотрел возможность размещения объекта в сеансе, но после прохождения некоторых ответов на этом форуме я понял, что лучше избегать помещать слишком много данных в сеанс. Итак, каков наилучший способ приблизиться к этому?

Спасибо ..

+0

Извините, но прежде чем искать наилучшие способы кэширования данных пользователя, я должен настаивать на том, чтобы вы смотрели на такие вещи, как SRP (принцип единой ответственности). При кэшировании этого объекта вы также будете кэшировать соединение с БД внутри. Это не отличная идея. –

ответ

2

Если вы не хотите, чтобы сохранить его в сессии, вы можете просто сделать инклюдники и иметь экземпляра там. Таким образом, если есть что-то еще, что вам нужно делать на каждой странице, все, что вам нужно сделать, это добавить его туда.

Кроме того, для если-то еще вещи, вы могли бы сделать что-то вроде следующего:

$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 ''; 
} 

Затем вы можете использовать этот метод для других свойства.

+0

Я не знаю, почему я не думал об использовании оператора include. Я думаю, что мой мозг потух. Спасибо :-) – depz123

Смежные вопросы