Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Objektowe podejście do produktu
Forum PHP.pl > Forum > PHP > Object-oriented programming
porady-it.pl
Witam,

Chciałem się dowiedzieć czy mój tok myślenia odnośnie programowania obiektowego jest właściwy. Napisałem klasę do obsługi produktu jest to oczywiście mały zalążek tej klasy jednak nim zacznę pisać dalej chciałem się upewnić czy rozwiązania przyjmowane prze zemnie są prawidłowe.

  1. <?php
  2.  
  3. class product {
  4.  
  5. /**
  6.  * Uchwyt do bazy danych.
  7.  * 
  8.  * @var myPDO
  9.  */
  10. private $db;
  11.  
  12. /**
  13.  * Przechowuje identyfikator produktu.
  14.  * 
  15.  * @var int
  16.  */
  17. private $id;
  18.  
  19. /**
  20.  * Przechowuje nazwę produktu.
  21.  *
  22.  * @var string
  23.  */
  24. private $name;
  25.  
  26. /**
  27.  * Przechowuje cenę produktu.
  28.  * 
  29.  * @var float
  30.  */
  31. private $price;
  32.  
  33. /**
  34.  * Przechowuje listę parametrów przypisanych do produktu.
  35.  * 
  36.  * @var array
  37.  */
  38. private $parameters;
  39.  
  40. /**
  41.  * Konstruktor tworzy uhcwyt do bazy danych.
  42.  */
  43. public function __construct() {
  44. $this->db = myPDO::getInstance();
  45. }
  46.  
  47. /**
  48.  * Ustawia identyfikator produktu.
  49.  * 
  50.  * @access public
  51.  * @param int $id - identyfikator produktu
  52.  * @return void
  53.  */
  54. public function setID($id) {
  55.  
  56. $this->id = (int)$id;
  57.  
  58. //jeśli został przypisany identyfikator różny od zera 
  59. //pobieramy informacje z bazy danych
  60. if($id)
  61. $this->_getInfo();
  62. }
  63.  
  64. /**
  65.  * Ustawia nazwę produktu.
  66.  * 
  67.  * @access public
  68.  * @param string $name - nazwa produktu
  69.  * @return void
  70.  */
  71. public function setName($name) {
  72. $this->name = $name;
  73. }
  74.  
  75. /**
  76.  * Ustawia cenę produktu.
  77.  * 
  78.  * @access public
  79.  * @param float $price - cena produktu
  80.  * @return void
  81.  */
  82. public function setPrice($price) {
  83. $this->price = $price;
  84. }
  85.  
  86. /**
  87.  * Zwraca nazwę produktu.
  88.  * 
  89.  * @access public
  90.  * @return string
  91.  */
  92. public function getName() {
  93. return $this->nazwa;
  94. }
  95.  
  96. /**
  97.  * Zwraca cenę produktu.
  98.  * 
  99.  * @access public
  100.  * @return float
  101.  */
  102. public function getPrice() {
  103. return $this->price; 
  104. }
  105.  
  106. /**
  107.  * Zwraca identyfikator produktu.
  108.  * 
  109.  * @access public 
  110.  * @return int
  111.  */
  112. public function getID() {
  113. return $this->id;
  114. }
  115.  
  116. /**
  117.  * Pobiera informacje z bazy danych o produkcie.
  118.  *
  119.  * @access private
  120.  */
  121. private function _getInfo() {
  122.  
  123. $stmt = $this->db->query(' SELECT 
  124. *
  125.  
  126. FROM 
  127. '.PRODUCTS.
  128.  
  129. WHERE 
  130. id = '.$this->id);
  131.  
  132. $arrProduct = $stmt -> fetch(PDO::FETCH_ASSOC);
  133.  
  134. $stmt->closeCursor();
  135.  
  136. //przypisanie danych z bazy do zmiennych
  137. $this->name  = $arrProduct['name'];
  138. $this->price  = $arrProduct['price'];
  139. }
  140. }
  141. ?>


Pierwsze moje pytanie dotyczy samego pobierania danych produktu z bazy danych czy przyjęte rozwiązanie jest prawidłowe czy też można to rozwiązać w jakiś lepszy sposób questionmark.gif

Kolejna sprawa dotyczy aktualizacji danych produktu, gdzieś wyczytałem (niestety obecnie nie jestem w stanie określić źródła tych informacji), że dobrym podejściem jest aktualizacja danych produktu w bazie przy niszczeniu obiektu (pisząc odpowiednią funkcję w destruktorze). Czy rzeczywiście jest to dobre rozwiązanie questionmark.gif
Helios
Ja bym dazyl do osiagniecia takiego mechanizmu:

  1. <?php
  2. $objProductManager = new ProductManager;
  3.  
  4. $objProductManager->addProduct(new Product('Ksiazka', 32.50, 300));
  5.  
  6. $objProduct = $objProductManager->getProductById(30);
  7.  
  8. print $objProduct->getName();
  9.  
  10. while($objProduct = $objProductManager->getProducts()){
  11. print $objProduct->getId();
  12. print $objProduct->getName();
  13. }
  14. ?>


Rozdzielilbym operacja na bazie danych/zrodla danych od jednostki elementarnej czyli produktu.
Manager przyjmuje obiekt produktu i go dodaje do bazy, manager zwraca obiekt produktu z bazy, na ktorym pozniej mozesz prowadzic dalsze operacje.

W OOP jestem poczatkujacy, ale tak to rozumuje.
porady-it.pl
Czyli rozumiem że w tym wypadku funkcja _getInfo która pobiera informacje z bazy o produkcie miała by zostać przerzucona do klasy ProductManager jako getProductById i mniej więcej miło by to wyglądać w następujący sposób:

  1. <?php
  2. class ProductManager {
  3.  
  4. public function getProductById($id) {
  5.  
  6. $stmt = $this->db->query(' SELECT 
  7. *
  8.  
  9. FROM 
  10. '.PRODUCTS.
  11.  
  12. WHERE 
  13. id = '.$id);
  14.  
  15. $arrProduct = $stmt -> fetch(PDO::FETCH_ASSOC);
  16.  
  17. $stmt->closeCursor();
  18.  
  19. $objProduct = new product();
  20.  
  21. $objProduct->setName($arrProduct['name']);
  22. $objProduct->setPrice($arrProduct['price']);
  23. $objProduct->setID($arrProduct['id']);
  24.  
  25. return $objProduct;
  26. }
  27.  
  28. }
  29. ?>


Mam jeszcze takie pytanko bowiem Ty w swoim przykładzie pokazywałeś że podstawowe dane produktu są przesyłane przez konstruktor, czy należy tak robić nawet w przypadku bardzo dużej ilości parametrów ?
skowron-line
Wedlug mnie twoja metoda wybierajaca dane z bazy powinna zwrocic tablice na ktorej potem bedziesz operowal, a co do konstruktora to powinienes tam wsadzic tylko to co bedzie ci potrzebne przy tworzeniu obiektu klasy
porady-it.pl
Rzeczywiście zgadzam się z Tobą że lepszym rozwiązaniem będzie zwracanie tablicy. Tak się zastanawiam czy przydakiem obiekt "product" nie będzie już zbędny, gdyż zwrócone dane w postaci tablicy mogę bezpośrednio przekazać do szablonu np. smarty gdzie dane te zostaną wyświetlone. Czy w takim wypadku tworzenie obiektu "product" nie zatraca sensu ? W jakim przypadku obiekt "product" może się przydać ?
Cysiaczek
W oczywsity sposób - nie musisz pisać kod SQL za każdym razem. Lepszym rozwiązaniem jest stosowanie obiektu Product i productsManager.
Wtedy sam Product to odzwierciedlenie tabeli/tabel bazy danych i operacje na niej, natomiast productsManager, jak nazwa wskazuje - zarządza obektami typu Product. Może zawierać metody np, takie (one nie sa statyczne - tylko tak się zapisuje): productsManager::getAsArray(), productsManager::getProducts(), productsManager::addToCollection() itp.

Pozdrawiam.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.