Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Klasa produkt
Forum PHP.pl > Forum > PHP
smajster
Do swojego sklepu staram się zaprojektować klasę produkt, ale nie do końca wiem czy dobrze się za to biorę (jest to moja pierwsza klasa), także jakbyście mi mogli powiedzieć czy dobrze kombinuje.

jej wstepny projekt:
  1. <?php
  2. class produkt
  3. {
  4. var $id = 0; //jak jest zero ozncza to ze klasa nie odpowiada konkretnemu produktowi
  5.  
  6. function __construct($id_produktu)
  7. {
  8. $this->id = $id_produktu;
  9. }
  10. function dodaj($grupa, $podgrupa, $producent, $nazwa, $parametr1, $parametr2, $cena, $cenahurt, $promocja, $ilosc, $opis, $zdjecie)
  11. {
  12. //dodaje produkt do bazy
  13. }
  14. function kod_produktu($grupa, $podgrupa)
  15. {
  16. //generuje unikalny kod produktu
  17. }
  18. function usun()
  19. {
  20. //usuwa produkt z bazy
  21. }
  22. function wyswietl($cecha)
  23. {
  24. //wyswietla konkretna ceche produktu, np. nazwe lub parametr
  25. }
  26. function edytuj($cecha, $wartosc)
  27. {
  28. //zmienia konkretna wartosc jednej z cech produktu
  29. }
  30. function wartosc($rabat, $rodzaj)
  31. {
  32. //oblicza wartosc produktu zaleznie od rodzaju ceny (hurt, detal, promocja) oraz rabatu
  33. }
  34.  
  35.  
  36.  
  37. }
  38. ?>

Mam watpliwości co do metody dodaj, bo jest ona trochę niespojna z resztą klasy, bo jako jedyna nie wymaga parametru( id produktu) bo jeszcze takiego poprostu nie posiada, także nie wiem czy powinnem ją umieszczać w tej klasie.
Zastanawiam się też jeszcze czy jeden argument to nie mało, ale zaden inny mi nie przychodzi na mysl.

Będe wdzieczny za wszelkie uwagi które pomogą mi nabrać doświadczenia w tworzeniu klas.

Pozdrawiam
Jim
nie jestem specem od obiektowości, ale w ostatnim projekcie użyłem schematu aktywnego rekordu. Czyli w twoim przypadku to by wyglądało tak:
  1. <?php
  2. class product {
  3. public $id;
  4. public $title;
  5. public $description;
  6. public $price;
  7. public $count;
  8.  
  9.  
  10. /**
  11.    * konstruktor
  12.    * jeżeli podany jest parametr, pobierane sa dane z bazy danych
  13.    */
  14. public function __construct( $id = null ) { }
  15.  
  16.  
  17. /**
  18.    * pobieranie danych
  19.    * jeżeli podany jest $id, pobierane sa dane z bazy danych
  20.    */
  21. public function fetch( ) { }
  22.  
  23.  
  24. /**
  25.    * update
  26.    * jeżeli podany jest $id, następuje UPDATE bazy danych, jeśli nie to INSERT
  27.    */
  28. public function update( ) { }
  29.  
  30. /**
  31.    * delete
  32.    * jeżeli podany jest $id, rekord jest usuwany z bazy danych
  33.    */
  34. public function delete( ) { }
  35.  
  36. }
  37. ?>

to tyle w tej sprawie winksmiley.jpg




W tym sposobie najlepsze jest to, że można utworzyć klasę abstakcyjną z metodami fetch(), update(), delete() po której będą dziedziczyły klasy product, user, category itd. Wtedy dopisywanie nowych modułów jest prostrze.

przykład klasy abstrakcyjnej
  1. <?php
  2. abstract class data {
  3.  
  4. /**
  5.    * funkcja która w zależności od parametru zwaraca nazwę klucza podstawowego, 
  6.    * lub nazwę tabeli na której dokonywane są operacje.
  7.    * jest to niezbędne dla metod korzystających z bazy danych, przecież muszą wiedzieć
  8.    * do jakiej tabeli wstawić dane.
  9.    */
  10. abstract function cfg($setting);
  11.  
  12. function update() { }
  13. function delete() { }
  14.  
  15. /**
  16.    * pobiera dane rekordu z bazy danych
  17.    */
  18. function fetch() { }
  19.  
  20. /**
  21.    * formatuje dane rekordu tak aby można było je wstawić do zapytania SQL
  22.    */
  23. function ListDataSql () { }
  24.  
  25. /**
  26.    * pobiera dane rekordu jako tablicę
  27.    */
  28. function ListDataArray() { }
  29. }
  30. ?>


wtedy klasa product (user, cokolwiek) wyglądałaby tak:
  1. <?php
  2. class product extends data{
  3. public $id;
  4. public $title;
  5. public $description;
  6. public $price;
  7. public $count;
  8.  
  9. public function __construct( $id = null ) { }
  10. public function cfg($setting) { }
  11.  
  12. /** 
  13.    * można dodać też metodę validate() do walidacji danych np pochodzących z formularza
  14.    */
  15. }
  16. ?>


jednak problem powstał, gdy trzeba było utworzyć bardziej skomlikowane relacje między rekordami (możliwe że jeszcze czegoś nie wiem smile.gif )




zlinczujcie mnie jeśli głupoty gadam. snitch.gif
TomASS
@Jim: Bardzo trafne i fajne uwagi smile.gif Bardzo dobrym pomysłem jest użycie klasy abstrakcyjnej lub interfejsu.

@smajster:
Skoro używasz __construct to znaczy się, że używasz PHP5, więc metody i właściwości nadawaj atrybuty private/protected/public, tak będzie bardziej elegancko.

Z dodawaniem to zrób tak:
1. konstruktor nie może miec domyslny ID taki jak to podał Jim:
  1. <?php
  2. __construct( $id = null )
  3. ?>

2. tworzysz sobie taki obiekt bez parametru ID
3. wywołujesz metodę dodaj, a jako parametr możesz przekazac tablice dodatkowych parametrów.
zamiast
  1. <?php
  2. function dodaj($grupa, $podgrupa, $producent, $nazwa, $parametr1, $parametr2, $cena, $cenahurt, $promocja, $ilosc, $opis, $zdjecie)
  3. ?>

zrób tak
  1. <?php
  2. function dodaj($Array)
  3. ?>



Jak na pierwszą klasę to jest dobrze smile.gif Tak jak zaleca kolega Jim - poczytaj o klasach abstrakcyjnych i interfejsach.

Powodzenia
smajster
Witam ponownie smile.gif

Postarałem się wprowadzić w życie zmiany jakie mi zaproponowaliście i wyszło mi takie cuś:
  1. <?php
  2. ////////////////////////////////
  3.  ///===== KLASA DATA
  4.  //
  5.  //
  6.  
  7. abstract class data 
  8. {
  9. protected $data;
  10. protected $tabela;
  11.  
  12. abstract function dodaj($Array);
  13. abstract function popraw($Array);  
  14. abstract function usun($id);
  15.  
  16.  protected function pobierz_dane($id)
  17.  {
  18.  $pyt = "SELECT * FROM ".$tabela." WHERE id = ".$id;
  19.  $rezult = mysql_query($pyt);
  20.  if(mysql_num_rows($rezult)>0)
  21.  $data = mysql_fetch_array($rezult);
  22.  else echo"nie ma takiego id";
  23.  } 
  24. public function podaj($id,$kolumna)
  25. {
  26. $this->pobierz_dane($id);
  27. if(isset($this->data[$kolumna]))
  28. return $this->data[$kolumna];
  29. else
  30. echo"nie ma takiej kolumny!";
  31. }
  32. protected function id()
  33. {
  34. $pyt="SELECT MAX(id) as ilgrup FROM " .$tabela;
  35. $rezult = mysql_query($pyt);
  36. if($rezult != NULL)
  37. {
  38. $rekord = mysql_fetch_array($rezult);
  39. var $id = $rekord['ilgrup']+1;
  40. return $id;
  41. }
  42. else
  43. return 1;
  44. }
  45. }
  46.  
  47. ?>


  1. <?php
  2. ////////////////////////////////
  3.  ///===== KLASA GRUPA
  4.  //
  5.  //
  6. class grupa extends data
  7. {
  8. protected $tabela = "_dbProducts._dbtGroup";
  9. public function dodaj($Array)
  10. {
  11. if($Array["kod"] =="")
  12. {
  13. $pyt = "INSERT INTO " .$tabela."(id, kod, nazwa, iloscpodg)  VALUES(".$this->id().", " .$this->kod_grupy().", " .$Array["nazwa"].", "0");";
  14. }
  15. else
  16. {
  17. $pyt = "INSERT INTO " .$tabela."(id, kod, nazwa, iloscpodg)  VALUES(".$this->id().", " .$Array["kod"].", " .$Array["nazwa"].", "0");";
  18. }
  19.  $rezult = mysql_query($pyt);
  20. }
  21. private function kod_grupy()
  22. {
  23. $pyt="SELECT MAX(id) as ilgrup FROM " .$tabela;
  24. $rezult = mysql_query($pyt);
  25. if($rezult != NULL)
  26. {
  27. $rekord = mysql_fetch_array($rezult);
  28. var $kod = $rekord['ilgrup']+1;
  29. return $kod;
  30. }
  31. else
  32. return 1;
  33. }
  34. public function popraw($Array)
  35. {
  36. $pyt = "UPDATE " .$tabela." SET nazwa = '" .$Array["nazwa"] ."'  WHERE grupa = " .$Array["id"];  
  37.  $rezult = mysql_query($pyt);
  38.  if($rezult != NULL)
  39.  return 1;
  40.  else return 0;
  41. }
  42. public function usun($id)
  43. {
  44. // POBRANIE Z BAZY NAJWIĘKSZEGO ID
  45. $maxGrp=($this->id - 1);
  46. // POBRANIE GRUPY O NAJWIĘKSZYM ID
  47. $pyt = "SELECT * FROM " .$tabela." WHERE id = " .$maxGrp;
  48.  $rezult = mysql_query($pyt);
  49.  $ostatni = mysql_fetch_array($rezult);
  50.  // ZAMIANA GRUPY O NAJWIĘKSZYM ID NA ID KTÓRE MA BYĆ USUNIĘTE
  51.  $pyt = "UPDATE " .$tabela." SET grupa = " .$ostatni["grupa"] .", nazwa = '" .$ostatni["nazwa"] ."', iloscpgp = " .$ostatni["iloscpgp"] ." WHERE id = " .$id;
  52.  $rezult = mysql_query($pyt);
  53.  // USUWANIE OSTATNIEJ (O NAJWIĘKSZYM ID) GRUPY
  54. $pyt = "DELETE FROM " .$tabela." WHERE id = " .$id;
  55. $rezult = mysql_query($pyt);
  56. if(!(mysql_num_rows($rezult)>0))
  57. echo"nie ma takiego id";
  58. } 
  59. }
  60. ?>


Klasa grupa jest mniej wiecej analogiczna do klasy produkt tylko prostrza i krotsza dlatego ją zamieściłem, obie dziedziczą od klasy data. Jak myślicie tak to powinno wyglądać? Obie te klasy mają znajdować się niby w klasie modelu. Są to moje pierwsze skończone klasy także proszę o wyrozumiałość smile.gif
Jak zauważacie jakieś błędy bardziej merytoryczne niż składniowe to skrobnijcie, bo chciałbym się jak najszybciej nauczyć poprawnie pisać w OOP.

Pozdrawiam
Cysiaczek
Może tak. co robi taka konstrukcja w ciele metody?
  1. <?php
  2. ...
  3. var $kod = $rekord['ilgrup']+1;
  4. ...
  5. ?>


Przeciez to powoduje błąd składni!
smajster
Skad mi sie to var tam wzielo tongue.gif

Ale jeśli chodzi o jakieś błędy bardziej merytoryczne?
Mam wątpliwości czy powinno być : protected $data , czy może jednak rozpisać to na wszystkie zmienne wchodzące w jej skład.
TomASS
1. Jak na pierwszą skończoną to mi się podoba. smile.gif

2. Do wyrzucania komunikatów użyłbym wyjątków.

3.
Cytat
protected $data , czy może jednak rozpisać to na wszystkie zmienne wchodzące w jej skład.

Jeśli dasz tak jak piszesz, czyli protected $data, i w tablicy $data będziesz trzymał wszystkie zmienne wchodzące w jej skład, to bardzo prosto napiszesz ciało metod magicznych __set i __get.

4. Nie lubię czegoś takiego:
  1. <?php
  2. if($rezult != NULL)
  3. if($Array["kod"] =="")
  4. ?>

sprawdź raczej empty/isset, chyba, że z jakichś powodów tego nie zrobiłeś?
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.