Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реализация интернет магазина 
V
    Опции темы
gibbzy
Дата 17.1.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 25.1.2008

Репутация: нет
Всего: 3



Возникли вопросы по реализации кусков интернет магазина. Точнее сказать всё понятно только меня пугают некоторые вещи.
Ниже приведу 2 класса, для продукта и категории.




  
Код

 <?php
   require_once('Database.php'); #класс для соединения с базой данных
 class Product{
 public $name;            #параметры товара которые хранятся в соотвествующей таблице
 public $about;
 public $price;
 public $category;
 public $id;
 private $upd=false;            #флажок нужно ли обновлять
 function Product($id){   # конструктор выбираем всё из базы для соотвествующего id присваеваем параметрам
          DataBase::connect();
          $sql = 'SELECT * FROM product WHERE id ='.$id;
          $result  = mysql_query($sql);
          $array = mysql_fetch_array($result);
          $this->id = $id;
          $this->name = $array['name'];
          $this->about = $array['about'];
          $this->price = $array['price'];
          $this->category = $array['category'];
      }
     static function add($name,$about,$price,$category){ # функция добавления товара сделал статичной ибо решил что обьекта для нее не стоит создавать
         DataBase::connect();
         $sql = "INSERT INTO product(name,about,price,category) VALUES ('$name','$about','$price','$category')";
          if(mysql_query($sql)){
           return true;
          }else {return false;}
      }
     
      #сеттеры
      public function setName($name){
         $this->name = $name;
          $this->upd = true;
      }
      public function setAbout($about){
          $this->about = $about;
          $this->upd = true;
      }
      public function setPrice($price){
          $this->price = $price;
          $this->upd = true;
      }
      public function setCategory($category){
          $this->category= $category;
          $this->upd = true;
      }
     
     function __destruct(){ # деструктор если флажок в положении true то обновляем базу данных
         if($this->upd){
              $sql = "UPDATE product SET name='$this->name',about = '$this->about',price = '$this->price',category = $this->category WHERE id = $this->id";
              mysql_query($sql);
          }
      }
  }
 ?>


Второй класс для категорий.

Код

 <?php
 require_once('Database.php');
 class Category {
   public $id;
   public $name;
   public $parent;
   private $upd=false;
   function Category($id){
       $sql = 'SELECT * FROM categry WHERE id='.$id;
       $result = mysql_query($sql);
   $array = mysql_fetch_array($result);
          $this->id = $id;
         $this->name = $array['name'];
          $this->parent = $array['parent'];
      }
      static function add($name,$parent){
          DataBase::connect();
          $sql ="INSERT INTO category(name,parent)VALUES('$name','$parent')";
          if(mysql_query($sql)){return true;}else{return false;}
      }
       function setName($name){
           $this->name = $name;
           $this->upd = true;
       }
       function setParent($parent){
           $this->parent = $parent;
           $this->upd = true;
       }
       function getChild(){ # возвращает обьект - дочернюю категорию
           $sql = "SELECT id FROM category WHERE parent = $this->id";
           $result = mysql_query($sql);
           $arr = mysql_fetch_array($result);
           $category = new Category($arr['id']);
           return $category;
       }
       function getProducts(){ #возвращает массив обьектов всех продуктов которые содержатся в данной категории
           $sql = "SELECT id FROM products WHERE category = $this->id";
           $result = mysql_query($sql);
           $products = array();
           while ($array=mysql_fetch_array($result)){
               $prod = new Product($array['id']);
               array_push($products,$prod);
           }
           return $products;
      }
       function __destruct(){
           if($this->upd){
               $sql ="UPDATE category SET name='$this->name', parent='$this->parent' WHERE id = $this->id ";
               mysql_query($sql);
           }
       }
      
   }
   ?>


Очень удобный подход мне всё нравиться, только вот вызывает опасения то что при создании нового обьекта конструктор делает запрос к БД ввиду чего многие функкции становятся очень опасными в плане производительности.
яркий пример функция $category->getProducts(). Вижу 2 решения этой проблемы:
1. убрать конструкторы добавить геттеры в каждой функции get() делать запрос.
2. Кэшировать страницы, и не выполнять запросы лишний раз когда страница не изменяется, в рамках того что контент интернет магазина может менять только администратор, думаю что это будет очень хорошим решением.

Вообще такие вопросы как например получение списка продуктов для категории я использовал mysql функцию JOIN LEFT.


Вопросы:
1. Как  сделать подобную структуру более оптимизированной?
2. Что я делаю не так ?
3. Стоит ли использовать статичные  функции для добавлления новых элементов или есть ещё какой то вариант?
4. Стоит ли параметры обьектов обьявлять как public или лучше использовать геттеры для получения их значений?

Это сообщение отредактировал(а) gibbzy - 18.1.2009, 19:30
PM MAIL WWW ICQ   Вверх
gibbzy
Дата 18.1.2009, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 25.1.2008

Репутация: нет
Всего: 3



ну раз все молчат сообщу что ответ нашел сам 
1. 
1.1 использовать кэширование на стороне сервера. 
1.2 проапгрейдить конструктор продуктов следующим образом 
Код

function Product($id=null,$name=null,$price=null,$category=null){
// если какой то парметр кроме id  равен null всё таки делам запрос иначе инициализируем переменные в классе по заданным параметрам
}


2. 
2.1 у меня не верный метод getChild() в классе Сategory это я просто проглядел 
2.2 метод product ->add следует переименовать в create и возвращать экземпляр класса product 
2.3 существует проблема с синхронизацией если обьект продукт не уничтожен тогда деструктор не вызывается и данные не обновляются. Решается очень просто вмето деструктора делается метод update(<params>) который заносит всё в базу данных сразу. 
2.4 есть смысл разделить эти  классы на админские и пользовательские, админские наследовать от пользовательских, в  пользовательских включать кэширование.
3. 
ответил в пункте 2.3

4. нет не стоит геттеры это лишние куски кода инкапсулировать эти переменные в класс не стоит, смысла нет. 

Это сообщение отредактировал(а) gibbzy - 18.1.2009, 19:23
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0404 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.