Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Początki programowanie OOP
Forum PHP.pl > Forum > PHP > Object-oriented programming
Michal_PB1
Jestem nowy na tym forum więc witam wszystkich.

Teraz do sedna postanowiłem rozpocząć przygodę z programowaniem obiektowym i mam pytanie czy ten kod poniżej na sens programowania obiektowego ? Proszę o wyrozumiałość to początki, ale uwagi mile widziane.
  1. class User
  2. {
  3. private $mysql;
  4. private $host = "localhost";
  5. private $uzytkownik = "user";
  6. private $baza = "baza";
  7. private $haslo = "haslo";
  8. private $prefiks = "prefiks_";
  9.  
  10. function __construct() {
  11.  
  12. $this -> spr_stan();
  13. $this -> mysql = new mysqli ($this -> host, $this -> user, $this -> pass, $this -> db);
  14.  
  15. }
  16.  
  17. function __set ($nazwa, $wartosc) {
  18. $this -> $nazwa = $wartosc;
  19. }
  20.  
  21. function __get ($nazwa) {
  22. return $this -> $nazwa;
  23. }
  24.  
  25. function zaloguj($login, $haslo) {
  26.  
  27. $sql = "SELECT * FROM ".$this -> prefiks."account WHERE login = $login AND password = $haslo ;";
  28. $sqlQry = $this -> mysql -> query($sql);
  29. $ile = $sqlQry -> num_rows;
  30. if ($ile == '1') $_SESSION['stan'] = '1';;
  31.  
  32. }
  33.  
  34. function wyloguj() {
  35.  
  36. $_SESSION['stan'] = '0';
  37. header('Location: index.php');
  38.  
  39. }
  40.  
  41. function zmien_haslo($email, $haslo) {
  42.  
  43. }
  44.  
  45. function spr_stan() {
  46.  
  47. if($_SESSION['stan'] == '1')
  48. echo '<script>powiadomienie(\'Zalogowano\', \'accept\');</script>';
  49. else
  50. {
  51.  
  52. echo '<script>powiadomienie("Aby przeglądać Panel Admina musisz się <button onClick=\"show_login();\">", "information");</script>';
  53. }
  54.  
  55. }
  56.  
  57. }
Fifi209
Dane do połączenia z bazą powinny zostać przekazane np do konstruktora a nie na stałe zapisane w ciele klasy.
Metody __set i __get nic nie wnoszą i są tutaj niepotrzebne
Brak flirtowania danych (patrz zaloguj)
spr_stan powinna zwracać true/false w zależności czy zalogowany czy nie, zamiast wyrzucać jakieś komunikaty.
Michal_PB1
Właśnie dane do połączeni z bazą dałem na stałe (na tą chwilę), ponieważ zastanawiałem się jak zrobić, aby w kilku klasach można było z bazy korzystać. Bo za każdym razem przekazywać dane np do konstruktora to trochę nie poręczne, myślałem nad dziedziczeniem (tylko nie wiem czy to ma sens) oraz użycie zmiennej globalne i tutaj nie do końca wiedziałem jak to uczynić smile.gif
Co do __set i __get to racja na chwilę obecną nic nie wnoszą.
Co spr_stan to słusznie biggrin.gif
d.stp
Przyłączam się do pytania z połączeniem z bazą - jak to najlepiej zrobić, żeby można było korzystać z połączenia w kilku klasach?
Dipter
Prócz tego co wypisał Tobie Fifi209, to ad. komunikatów, które wyrzucasz podczas wystąpienia czegokolwiek - od tego są wyjątki + do tego polecam wpis na blogu Zyxa.

Co do trzymania jakichś właściwości klasy (w twoim przypadku User) wykorzystaj do tego kontener/tablicę (lecz tracisz w tym przypadku brak supportu ze strony IDE), bądź po prostu ustaw je jako zmienne w klasie i za pomocą IDE wygeneruj metody set/get.

Swoją drogą klasa User, raczej powinna określać danego użytkownika jako byt, nie jako forma autoryzacji. Ponadto staraj się używać konwencji PSR-0/1/2 i angielskiego nazewnictwa.

Ad. przekazywania połączenia z bazą danych - Najlepiej jest to zrobić poprzez przekazanie obiektu jako argument choćby konstruktora. Stwórz abstrakcyjną klasę zajmującą się "Modelem" czyli warstwą do obsługi danych i ustal w niej metodę do przekazania połączenia. Nigdy zaś nie powinieneś dziedziczyć w stylu Użytkownik - Baza danych.
Fifi209
W dużym ułatwieniu można choćby użyć singleton'a, którego nie polecam.

Drugim wyjściem jest napisanie jakieś klasy, która będzie trzymała cały config i połączenie z bazą w sobie i wtedy z każdego miejsca się tam dostaniesz.
pyro
Ten kod jest niepoprawny z kilku powodów:

1. Wspomniane już robienie "dwulicowej klasy".
2. Pakowanie widoku w model.
3. Niepoprawne wywoływanie funkcji w konstruktorze.
4. Mieszanie polskich nazw z angielskimi.
5. Niekompletny kod.
6. Brak komentarzy przez co potem się pogubisz.

Przykładowe poprawne rozwiązanie (propo bazy danych):

  1. class User {
  2.  
  3. private $conn;
  4. public static $userTablePrefix = 'prefiks_';
  5.  
  6. public function __construct($conn) {
  7. $this->conn = $conn;
  8. }
  9.  
  10. }
q3trm
Korzystając z tematu. Mam pytanie, dlaczego niektóre zmienne składowe daje się w nawiasy klamrowe, np.


$variable = "{$this ->producerFirstName}";


Czytam książke "PHP Obiekty, wzorce, narzędzia" i tu autor często stosuję tę konwencję - niestety bez wspominek o konieczności ich stosowania.

Z mojego domysłu używa się ich do seperacji, ciągów znaków od innych typów danych, myle się?.
pyro
http://php.net/manual/en/language.types.string.php -> curly syntax
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.