Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: OOP i projektowanie
Forum PHP.pl > Forum > PHP > Object-oriented programming
eVolution
Witam,
Jako, że dopiero zaczynam naukę OOP, chciałbym się Was zapytań, czy jest to dobrze napisana klasa.

Klasa do obsługi bazy danych
  1. <?php
  2.  
  3. class DB
  4. {
  5. public function __construct()
  6. {
  7. try
  8. {
  9. $this->baza = new PDO('mysql: host=localhost; dbname=db', 'login','pass');
  10. }
  11. catch(PDOException $e)
  12. {
  13. throw new Exception($e->getMessage());
  14. }
  15. }
  16.  
  17. public function prepare($query)
  18. {
  19. return $result=$this->baza->prepare($query);
  20. }
  21. }
  22.  
  23. ?>


Klasa do obsługi użytkownika czyli dodanie, kasowanie
  1. <?php
  2. class User
  3. {
  4. protected $_db;
  5.  
  6. public function __construct(DB $db)
  7. {
  8. $this->_db = $db;
  9. }
  10.  
  11. public function add($login, $pass)
  12. {
  13. $result = $this->_db->prepare("INSERT INTO user VALUES(:login, :pass)");
  14. $result->bindParam(':login', $login, PDO::PARAM_STR);
  15. $result->bindParam('pass', $pass, PDO::PARAM_STR);
  16.  
  17. if(!$result->execute()){
  18. throw new Exception("Wystąpił błąd podczas dodawania usera.");
  19. }
  20. }
  21.  
  22. public function delete($id)
  23. {
  24. $result = $this->_db->prepare("DELETE FROM user WHERE id=:id");
  25. $result->bindParam(':id', $id, PDO::PARAM_INT);
  26.  
  27. if(!$result->execute()){
  28. throw new Exception("Wystąpił błąd podczas usuwania usera.");
  29. }
  30. }
  31. }

I oczywiście osobno UserManger czyli odpowiedzialna za pobranie danych typu login, logowanie etc...

Czy w tym kodzie jest wszystko ok? Kolejna sprawa, blok try - catch dawać w metodach w klasie, czy w miejscu gdzie dana metoda jest wywołana?
wookieb
Po co ci klasa DB, która nie wprowadza żadnej funkcjonalności poza bezsensownym wstawieniem na sztywno danych dla połączenia?
eVolution
Dlatego założyłem ten temat, żeby mi ktoś wyjaśnił co i jak, i czy kod jest dobry. Ale już widzę, że nie. Czyli rozumiem, że najlepiej zawartość konstruktora z klasy DB dać do klasy User w konstruktor, i jest to lepszym rozwiązaniem?
wookieb
Nikt Cię tutaj nie nauczy OOP bo to bardzo szeroka dziedzina
Od tego są odpowiednie książki helion -> wzorce projektowe
by_ikar
Cytat
Czyli rozumiem, że najlepiej zawartość konstruktora z klasy DB dać do klasy User w konstruktor, i jest to lepszym rozwiązaniem?

Nie. @wookieb'owi chodziło o to że twoja klasa DB nie robi nic innego prócz połączenia na sztywno, bo zarówno nie można przekazać żadnych ustawień, jak i ta klasa poza łączeniem się z bazą nic nie robi. I coś takiego większego sensu nie ma, bo równie dobrze gdzieś wcześniej możesz utworzyć połączenie w PDO i instancje PDO przekazać do klasy użytkownika. Pomijam już kwestię że praktycznie żadnych danych nie sprawdzasz..

Cytat
Czy w tym kodzie jest wszystko ok? Kolejna sprawa, blok try - catch dawać w metodach w klasie, czy w miejscu gdzie dana metoda jest wywołana?

A to już zależy od tego w jaki sposób chcesz obsłużyć wyjątek. Może masz tam jakiegoś handlera, wówczas nie musisz stawiać wszędzie try/catch, a jeżeli musisz wykonać inne działanie niż zatrzymanie aplikacji i komunikat o błędzie, to używaj try/catch..
eVolution
Skrobnąłem na szybko coś takiego:
  1. <?php
  2. class Kalkulator
  3. {
  4. function dodaj($liczba, $liczba2)
  5. {
  6. $this->wynik = $liczba + $liczba2;
  7. return $this;
  8. }
  9.  
  10. function odejmij($liczba, $liczba2)
  11. {
  12. $this->wynik = $liczba - $liczba2;
  13. return $this;
  14. }
  15.  
  16. function mnozenie($liczba, $liczba2)
  17. {
  18. $this->wynik = $liczba * $liczba2;
  19. return $this;
  20. }
  21.  
  22. function wynik()
  23. {
  24. return $this->wynik;
  25. }
  26. }
  27.  
  28. $kalkulator = new Kalkulator;
  29. echo $kalkulator->odejmij(2,5)->wynik();
Czy tu jest wszystko ok? I mi nie chodzi o to, żeby ktoś mnie uczył OOP, tylko o to, że mam problem z tym, co np w danej klasie powinno się znaleźć. Np co powinno być w klasie odpowiedzialnej z 1 ucznia itp tak jak np w tej podanej powyżej to wiem co powinno być, ale jak już np chodzi o zrobienie bardziej sensownej klasy to już jest problem.

Poprawcie mnie jeśli się mylę:
Mam np obiekt samochód, czyli jego metody to skręcanie, hamowanie, przyśpieszenie, zwalnianie?
Kolejne mam obiekt użytkownik, jego metody to dodaj, usuń, aktualizuj, i UserManager czyli pokaz wybranego, pokaż wszystkich etc...? Wiem głupie pytania, ale żadna książka akurat tego nie opisuje wink.gif
viking
Może ściągnij sobie http://framework.zend.com/manual/en/learni...tart.intro.html i zobacz jak to może być zrobione.
eVolution
No właśnie ZF czy Kohana3 ? Oczywiście, bardziej z myślą o pracy jako progamista. Na ZF z tego co wiem jest większe zapotrzebowanie.
phpion
Na ZF jest większe zapotrzebowanie, a co za tym idzie także konkurencja większa. Weź pod uwagę, że poznając dany framework od podstaw musisz poświęcić sporo czasu by nabrać doświadczenia i posługiwać się nim biegle.
eVolution
Kohana3 wydaje się być prostym i lekkim frameworkiem, co przemawia na jego korzyść smile.gif W KO2 miałem okazję pracować, jakieś pół roku.
viking
Ale to wcale nie znaczy że musisz tylko do tych się ograniczać. Oprócz większych Jak ZF, Symfony czy przytoczona Kohana jest też sporo całkiem ciekawych projektów. Jest Yii, jest pisany trochę na wzór Sinatry (Ruby) Laravel czy w końcu http://lithify.me/. A przytaczam tylko skupiające większą społeczność i aktywnie rozwijane. Wszystkie też są sporo szybsze niż ZF i Symfony.
Orzeszekk
Naucz sie programowania obiektowego w Javie i pozniej przenies sie do php jak bedziesz jeszcze chcial. obiektowosc php jest troche toporna i mozesz sobie wyrobic zle nawyki.
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.