Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Prosta strona w OOP
Forum PHP.pl > Forum > PHP > Object-oriented programming
fannet
Witam serdecznie wszystkich.. zastanawiam się czy dobrze to wszystko rozumiem. Stworzyłem już standardowo (psełdo)klasę Albums na potrzeby strony z stosunkowo prostą bazą danych z albumami różnych wykonawców. Czy jest to zrobione dobrze w jak dużym stopniu przypomina to programowanie obiektowe. Problem w tym, że moje 3 pozostałe klasy (Artists, Songs, Categories) wyglądałby niemal identycznie tylko inne właściwości i nazwy.

  1. class Albums {
  2.  
  3. private $id; // id Albumu w bazie danych
  4. private $name; // nazwa albumu
  5. private $jear; // rok wydania
  6. private $artist; // artysta
  7. private $category; // gatunek
  8.  
  9. public function __construct() {
  10. // ustanawiam polaczenie z baza danych
  11. // wykorzstuje $this->db = new MySQLi..
  12. }
  13.  
  14. // funkcje dostepowe
  15. public function getId() { return $this->id; }
  16. public function getName() { return $this->name; }
  17. public function getJear() { return $this->jear; }
  18. public function getArtist() { return $this->artist; }
  19. public function getCategory() { return $this->category; }
  20.  
  21. // funckje dostepowe - ciag dalszy
  22. public function setId($id) { $this->id = $id; }
  23. public function setName($name) { $this->name = $name; }
  24. public function setJear($jear) { $this->jear = $jear; }
  25. public function setArtist($artist) { $this->artist = $artist; }
  26. public function setCategory($category) { $this->category = $category; }
  27.  
  28. public function create() {
  29. $query = "INSERT INTO...";
  30. $this->db->query($query);
  31.  
  32. while($row = $query->fetch_object()) {
  33. $this->setName($row->name);
  34. $this->setJear($row->jear);
  35. // i tak dalej
  36. }
  37. }
  38.  
  39. public function select() {
  40. $query = "SELECT album... WHERE id == {$this->getId()}";
  41. $this->db->query($query);
  42. }
  43.  
  44. public function update($field, $value) {
  45. $query = "UPDATE album SET $field = $value WHERE id == {$this->getId()}";
  46. $this->db->query($query);
  47. }
  48.  
  49. public function delete() {
  50. // w taki sam sposób kasuje
  51. }
  52. }
  53.  
  54. // przykładowa strona wyswietlajaca szczegółowe dane na temat albumu
  55. $album = Albums; // nowy album
  56. $album->setId(4); // ustawiam id 4
  57. $album->selsect(); // ustawiam album
  58.  
  59. // tworzac album
  60. $album = new Albums;
  61. $album->setName($_POST['name']);
  62. $album->setJear($_POST['jear']);
  63. $album->create();
  64.  
  65. // edytując album
  66. $album = new Albums;
  67. $album->setId(4);
  68. $album->selsect();
  69. if($_POST['name'] != $album->getName()) { $album->update('name',$_POST['name']); }
drozdii07
Sprawdz zapytania, masz tam bledy. I to nie szczesne jear..Co ty miales z ang w szkole ?
Crozin
1. Tutaj masz klasy Album, Artysta, Piosenka, a nie ich kolekcje więc używaj liczby pojedynczej w ich nazwach.
2. Każdy obiekt zajmuje się wyłącznie jednym zadaniem. Dlatego też powinieneś rozdzielić reprezentowanie danych i ich zapisywanie w bazie danych do dwóch różnych obiektów, Album (getTitle, getCategory, setArtist, ...) oraz AlbumManager (saveAlbum, deleteAlbum). W sumie pobieranie ich z bazy danych to również zadanie dla innego obiektu, powiedzmy AlbumRepository.
3. Ułatw sobie życie i korzystaj z type hintingu.
Psajkus
Cytat(Crozin @ 8.07.2011, 06:28:02 ) *
... oraz AlbumManager (saveAlbum, deleteAlbum). W sumie pobieranie ich z bazy danych to również zadanie dla innego obiektu, powiedzmy AlbumRepository.


Myślę, że samo repozytorium wystarczy.Repozytorium zawiera przede wszystkim operacje CRUD (Create, Read, Update, Deleted) oraz wszystkie inne operacje selekcji (np. GetById lub GetByQuery )
gac3k
A ja zamiast tworzyć 50 metod typu setId itd. zrobiłbym dwie magiczne metody __set i __get i tak to obsłużył.
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.