Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: klasa Artykuly
Forum PHP.pl > Forum > PHP > Object-oriented programming
l05i3k
Witam,
jestem początkujący w OOP i mam kilka wątpliwości i pytan w związku z klasami. Napisałem przykładową klasę (właściwie jej część):
  1. <?php
  2. class Artykuly { // extends Tresci
  3.  private $cBaza; //uchwyt bazy
  4.  private $artId;
  5.  private $artTytul;
  6.  private $artTresc;
  7.  private $artAutor;
  8.  private $artNotatki;
  9.  private $artData;
  10.  private $artCzas;
  11.  private $artOdslony;
  12.  private $artKategoria;
  13.  private $prefix = 'testy'; // prefix do tabel w bazie danych
  14.  
  15.  private function __construct() {
  16. $this->cBaza = pg_connect ('user=user password=haslo dbname=baza');
  17.  
  18. if (!is_resource($this->cBaza)) {
  19.  throw new Exception ("Nie można się połączyć z bazą.");
  20. }
  21.  }
  22.  
  23.  private function getArt($id, $ile=1, $początek=0) {
  24. // umieścić funkcje pobierania w odzielnej fukncji, czy lepiej dodać do konstrukto
    ra?
  25. $zapytanie = "SELECT * FROM `".$prefix."_artykuly` WHERE `id` = '".$id."' ORDER BY `id` ASC LIMIT '".$poczatek."', '".$ile."';";
  26. $res = pg_query($this->cBaza, $zapytanie);
  27. if (!is_resource($res)) {
  28.  throw new Exception("Błąd: Nieprawidłowe zapytanie. Sprawdź skrypt!");
  29. }
  30.  
  31. if (!pg_num_rows($res)) {
  32.  throw new Exception("Błąd: Brak artykułu o identyfikatorze ".$id.".");
  33. }
  34.  
  35. // i tutaj nachodzi mnie pytanie, jak wydobyć kilka artykułów? Czy mogę spokojnie użyć pętli foreach?
  36. $dane = pg_fetch_array($res);
  37. $this->artID = $id;
  38. $this->artTytul = $dane['tytul'];
  39. $this->artTresc = $dane['tresc'];
  40. $this->artAutor = $dane['autor'];
  41. [..] // pozostałe przypisy do właściwości klasy
  42. $this->artKategoria = $dane['kategoria'];
  43.  }
  44.  
  45.  function __get($parametr) { // wiadomo co to za funkcja... i tak tylko na tymczasem...
  46. if (isset($this->dane[$parametr])) {
  47.  return $this->dane[$parametr];
  48. }
  49. return '';
  50.  }
  51.  
  52.  private function usunArt($id) {
  53. // czy mogę w tym miejscu utowrzyć egzemplarz tej klasy?
  54. // $artDoUsuniecia = new Artykuly();
  55. // $artDoUsuniecia->getArt($id);
  56. // if (!isset($artDoUsuniecia->artTytul)) {
  57. // echo 'Błąd: Brak artykułu o identyfikatorze '. $id .', który chcesz usunąć!';
  58. // }
  59. // czy muszę jeszcze raz pisać kod, aby sprawdzić czy dany artykuł istnieje?
  60. // czy może istnieje jakiś inny sposób, aby sprawdzić czy ten artykuł został zapis
    any w bazie, uzywając np. '$this->getArt($id)'?
  61.  
  62. $zapytanie = "DELETE FROM `".$prefix."_artykuly` WHERE `id` = '".$id."';";
  63. $res = pg_query($this->cBaza, $zapytanie);
  64. if (!is_resource($res)) {
  65.  throw new Exception("Błąd: Nieprawidłowe zapytanie. Sprawdź skrypt!");
  66. }
  67.  }
  68.  
  69.  private function getKategoria($id) {
  70. return $this->artKategoria;
  71.  }
  72.  
  73.  private function getNextArtID($id) {
  74. [..] // inne fukcje
  75.  }
  76.  
  77. }
  78. ?>


Większość zastanawiających mnie rzeczy zamieściłem w komentarzach w kodzie, byłbym wdzieczny, gdyby ktoś rozwiał moje wątpliwości...
Chciałbym się dowiedzieć, czy mój tk rozumowania OOP jest prawidłowy? Czy można ten fargment klasy jakoś zoptymalizować?

Z góry dziękuję, za wszelkie sugestie...
jang
  1. <?php
  2. class Artykuly { // extends Tresci
  3.  
  4. class Artykuly extends Tresci
  5. ?>


// umieścić funkcje pobierania w odzielnej fukncji, czy lepiej dodać do konstruktora?

nie funkcje tylko metody
ani tu ani tu drogi Winetou tylko w osobnej klasie
  1. <?php
  2. class DAO_Pg_Artykuly <- dla postgre
  3. class DAO_Pdo_Artykuly <- dla PDO
  4. ?>

W powyższych klasach metody z zapytaniami do bazy

w klasie Artykuly
  1. <?php
  2. public function __construct()
  3. $this->db = Db_Pg::getInstance();
  4. $this->objDaoPg = new DAO_Pg_Artykuly($this->db);
  5. }
  6.  
  7. public function getArt($id, $ile=1, $początek=0)
  8. {
  9. $this->dane = $this->objDaoPg->getArt($id, $ile=1, $początek=0);
  10. }
  11.  
  12. public function getArtTytul()
  13. {
  14. return ($this->artTytul = $this->dane['tytul']);
  15. }
  16. ?>


// czy mogę w tym miejscu utowrzyć egzemplarz tej klasy?

Powinieneś raczej poczytać co to private, public ...
no i oczywiście singleton !
Jeśli chcesz to robić (tworzyć obiekt klasy w jej wnętrzu) to zobacz klasę user pod tym adresem - http://artykuly.zyxist.com/czytaj.php/wlasny_mechanizm_sesji
Helios
Jak dla mnie kod procedurlany objety w klase z dodatkami wyjatkow, zeby wygladalo bardziej obiektowo.
Klasa artykuly przechowuje zawartosc artykulu, udostepnia ja, pobiera dane z bazy dobrze ze chociaz uzytkownikowi wynikow nie prezentuje. Zobacz kilka postow nizej jest taki sam temat o Produkcie.
Ja to rozumuje tak: klasa podstawowa jest artykul i on zawiera reprezentacje jednego artykulu - i tu funkcja klasy jest latwa do zdefiniowania - klasa przechowuje reprezentacje artykulu. Klasa odrebna, o ktorej artykul nie wie, tylko udostepnia jej interfejs jest klasa zarzadzajaca artykulami, gdzie w jednym miejscu laczysz sie z baza danych lub wybierasz inne zrodlo danych w celu pobrania artykulow, i implementujesz interfejs zarzadzania artykulami. I ta klasa operuje na klasie bazowej.
I to ma sens, jezeli z czasem chcialbys wprowadzic np. drugi typ artykulu operujacy na odrebnej bazie danych, caly obszar decyzyjny masz w jednym miejscu. No i klasa zarzadzajaca moze przekazac gotowy, przyszykowany obiekt artykulu do innego obiektu w celu jego przetworzenia itd.
Zachowanie takiej odrebnosci wydaje mi sie logiczne. Bo nielogiczne dla mnie jest zeby klasa Artykuly (nie Artykul) przechowywala dane jednego artykulu, usuwala, pobierala itd.
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.