PHP ООП Класс дизайн - PullRequest
       1

PHP ООП Класс дизайн

2 голосов
/ 22 июля 2011

Исходя из Java, я чувствую себя более комфортно, используя Объекты и Классы, а не простые функции. Вопрос в том: В настоящее время у меня есть класс «Пользователь», который предлагает мне методы, такие как получение уровня доступа, изменение профиля, удаление уведомлений и т. Д. Каждый метод использует запрос к моей базе данных, чтобы получить необходимую информацию или обновить ее. Но в конструкторе я получаю основную информацию: идентификатор, адрес электронной почты, имя и фамилия (какие поля я использую чаще всего в каждом методе).

Какой дизайн вы бы использовали: (Ток)

class User{
   private $id;
   private $email;
   ...

   function __construct($id){
      //Connect to database
      ...
      $this->id=$id;
      $thid->name=$row['name'];
      ...

   }

   function getEmail(){
       return $this->email;
   }
  ...
}

Или:

class User{
   private $id;

   function __construct($id){
        $this->id=$id;
   }

   function getEmail(){
       //Connect to database using id
       return $row['email'];
   }
   ...
}

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

Заранее спасибо

Ответы [ 4 ]

3 голосов
/ 22 июля 2011

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

Далее, не подключайтесь к базе данных в вашем конструкторе. Потратьте время на создание фабрики классов для генерации ваших классов. Честно говоря, вы даже можете написать очень простой генератор кода, чтобы сгенерировать как класс модели, в котором хранятся все ваши поля данных, так и класс mapper, который идет в базу данных и строит ваш объект из таблицы, содержащей менее 100 строк кода.

Если у вас есть дополнительное время, изучите и используйте фреймворк, такой как Zend, или просто для данных, учите ...

(FWIW, я думаю, что изучение простых вещей в Zend Table даст вам экономию времени)

class User{
 protected $_id;
 protected $_email;
 protected $_username;
 protected $_userFirstName;

 public function __construct(){
 }
 public function setId($id){
   $this->_id = $id;
   return $this;
 }
 public function setEmail($email)
 {
   $this->_email = $email;
 }
  // etc and getters too
}

public class UserMapper
{
  protected $_connection;
  public function __construct($connection){
    $this->_connection = $connection;
  }
  public loadUser($id){ 
    $select = $this->_connection->select(' * from Users')
                         ->where('id = ?', $id);
    $result = $select->fetchAll();
    //error checking here
    $user = new User();
    $user->setId($results[0]['id'])
         ->setEmail($results[0]['email'])
         ->setUsername($results[0]['username']);
    return $user;
  }
  public saveUser(User $user){
  }
}
1 голос
/ 22 июля 2011

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

Итак, в заключение: перейдите к варианту № 1.

0 голосов
/ 22 июля 2011

Если вы не собираетесь работать с большим количеством этих объектов одновременно, разница в использовании памяти очень мала. Однако разница в выполнении одного запроса против нескольких будет гораздо более заметной, поэтому вам определенно следует использовать только один запрос для получения всех данных одновременно.

0 голосов
/ 22 июля 2011

Сначала я бы использовал все необходимые детали, которые, по вашему мнению, вы будете использовать на большинстве страниц.

Вторая версия - практика, потому что запрашивать базу данных каждый раз, когда вам нужно, - плохая практика

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...