Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [klasa] User.class.php
Forum PHP.pl > Forum > PHP > Object-oriented programming
fannet
Napisałem takie "coś" i mam nadzieję że jest to klasopodobne. Proszę o opinie, dobrze myślę czy też nie. Osobiście mam wrażenie że zamknełem kod strukturalny w klasie i nic więcej. Aczkolwiek szukając w internecie ciężko jest trafić na coś zrozumiałego. W większości spotkykam się z informacją co to jest klasa i jak ją stworzyć, dziedziczenie czy parę słów o hermetyzacji.. ;(

Proszę Was również o możliwe przykłady klas, nie zbyt skomplikowanych lecz ukazujących myślenie obiektowe, jeżeli takowa znacie wink.gif

  1. <?php
  2.  
  3. class User
  4. {
  5.  
  6. private $userid;
  7. private $userName;
  8. private $userEmail;
  9.  
  10. // Konstruktor pobiera dane uzytkownika, jezeli użytkonik nie jest zalogowany zglasza blad
  11. public function __construct()
  12. {
  13. if(!static::IsUserOnline())
  14. {
  15. throw new Exception("BRAK DOSTEPU DO TEJ STRONY");
  16. }
  17.  
  18. $this->GetUserData($_SESSION['user']);
  19. }
  20.  
  21. // Pobiera dane użytkowników
  22. public function GetUserData($id)
  23. {
  24. if(isset($id) && is_numeric($id))
  25. {
  26. $result = DatabaseManager::selectBySQL("SELECT userName FROM users WHERE userName = $id LIMIT 1");
  27. foreach ($result as $r)
  28. {
  29. $this->userName = $r['userName'];
  30. $this->userEmail = $r['userEmail'];
  31. }
  32. }
  33. }
  34.  
  35. // Loguje użytkonwika do serwisu
  36. public function UserLogin($name, $pass)
  37. {
  38. $name = mysql_escape_string($name);
  39. $pass = mysql_escape_string($pass);
  40. $result = DatabaseManager::selectBySQL("SELECT userid FROM users WHERE userName = '$name' && userPass = md5('$pass') LIMIT 1");
  41.  
  42. if($result)
  43. return $_SESSION['user'] = $result[0]['userid'];
  44. else
  45. return false;
  46. }
  47.  
  48. // Wylogowanie użytkonika z bazy danych
  49. public function UserLogout()
  50. {
  51. $_SESSION['user'] = false;
  52. }
  53.  
  54. // Tworzy nowego użtykonika
  55. static function SetNewUser($user, $email, $pass, $pass2)
  56. {
  57. // tworzymy polaczenie z baza danych
  58. $db = DatabaseManager::getConnection();
  59.  
  60. // Sprawdzamy czy użytkownik istnieje
  61. $checkUsers = $db->query("SELECT nick FROM users WHERE nick = $user");
  62. if(count($checkUsers) >= 1)
  63. return $msg = "Podana nazwa uzytkownika juz istnieje";
  64.  
  65. // Sprawdzamy czy podane hasła są jednakowe
  66. if($pass == $pass2)
  67. return $msg = "Podane hasła nie są jednakowe";
  68.  
  69. // Sprawdzamy poprawnosc adresu email
  70. if(!filter_var($email, FILTER_VALIDATE_EMAIL))
  71. return $msg = "Adres email jest nie poprawny";
  72.  
  73. // Wysyłamy użytkownika do bazy danych
  74. $query = $db->query("INSERT INTO users (`id`,`nick`,`email`,`pass`) VALUES (NULL, '$user', '$email', 'md5($pass)');");
  75. return $msg = false;
  76. }
  77.  
  78. // Funkcja statyczna sprawdzajaca czy uzytkonik jest zalogowany
  79. static function IsUserOnline()
  80. {
  81. if(isset($_SESSION['user']) && $_SESSION['user'] && is_numeric($_SESSION['user']))
  82. return true;
  83. else
  84. return false;
  85. }
  86. }
  87.  
  88. ?>


Pozdrawiam, Luke wink.gif
by_ikar
To jest bardziej userManager, czyli menadżer użytkowników, niż klasa użytkownika (pojedynczego) sama w sobie.
Fifi209
Konstruktor nie "zgłasza błąd" a rzuca nic nie znaczący wyjątek, nawet nie wiadomo z jakiej klasy pochodzi ani co jest przyczyną jego wystąpienia. W dodatku tutaj nie powinien być rzucany wyjątek.

Wszędzie gdzie masz zapytania SQL używasz "DatabaseManager" - co też ma złą nazwę, bo nijak nie służy do zarządzania bazami jak na moje oko, ale chciałem poruszyć inny temat, mianowicie filtrowania, powinno to się odbywać w w/w klasie a nie w "User".

  1. if($result)
  2. return $_SESSION['user'] = $result[0]['userid'];
  3. else
  4. return false;
  5. }

Powinno zwracać true/false, nic więcej użytkownika nie interesuje, jeżeli chcesz wyciągnąć ID zalogowanego to napisz metodę do tego.

SetNewUser -> CreateUser, Register etc.
Też powinna zwracać true/false i zapisać gdzieś błędy, które mógłbyś odczytać poprzez kolejną metodę.

Resztę napisał kolega przede mną wink.gif
brzoza91
  1. static function SetNewUser($user, $email, $pass, $pass2)
  2. {
  3. // tworzymy polaczenie z baza danych
  4. $db = DatabaseManager::getConnection();
  5.  
  6. // Sprawdzamy czy użytkownik istnieje
  7. $checkUsers = $db->query("SELECT nick FROM users WHERE nick = $user");
  8. if(count($checkUsers) >= 1)
  9. return $msg = "Podana nazwa uzytkownika juz istnieje";
  10.  
  11. // Sprawdzamy czy podane hasła są jednakowe
  12. if($pass == $pass2)
  13. return $msg = "Podane hasła nie są jednakowe";
  14.  
  15. // Sprawdzamy poprawnosc adresu email
  16. if(!filter_var($email, FILTER_VALIDATE_EMAIL))
  17. return $msg = "Adres email jest nie poprawny";
  18.  
  19. // Wysyłamy użytkownika do bazy danych
  20. $query = $db->query("INSERT INTO users (`id`,`nick`,`email`,`pass`) VALUES (NULL, '$user', '$email', 'md5($pass)');");
  21. return $msg = false;
  22. }]


A czy nie lepiej rozplanować to trochę inaczej ? żeby rozdzielić sprawdzanie poprawności danych od umieszczania ich do bazy danych ?
coolos
Cytat(brzoza91 @ 25.05.2012, 21:43:20 ) *
A czy nie lepiej rozplanować to trochę inaczej ? żeby rozdzielić sprawdzanie poprawności danych od umieszczania ich do bazy danych ?


Stwórz menadżera który to będzie tworzyć model danych np.

Model może wyglądać tak jak poniżej, może być obsłużony np. za pomocą magicznych metod __set() oraz __get(). Zadaniem poniższego modelu jest przechowywanie danych i nic więcej

  1. class USER_MODEL{
  2.  
  3. private $id;
  4. private $name;
  5. private $pass;
  6.  
  7. }


następnie stwóż menadżera modelu, który to będzie pobierać dane i umieszczać je w modelu i np. zwracać gdy kontroler o nie poprosi np.

  1. class USER_MODEL{
  2.  
  3. public function get_user($id){
  4. //tutaj kod odpowiedzialny za laczenie z baza danych wynikiem jest tablica $result
  5.  
  6. $user = new MODEL_USER();
  7. $user->id = $result->id;
  8. $user->name = $result->name;
  9. $user->pass = $result->pass;
  10. return $user;
  11. }
  12.  
  13. }


Co zrobić gdy np. mamy do pobrania 50 użytkowników(obiektów)? stwórz ich kolekcje o nazwie np. USER_MODEL_COLLECTION.

tak ja to widzę.

bastard13
Cytat
Osobiście mam wrażenie że zamknełem kod strukturalny w klasie i nic więcej

Przynajmniej wiesz, że coś tu jest nie tak, a to już połowa sukcesu:) Wiele osób uważa, że jak użyją magicznego słowa klas, to oznacza, że programują obiektowo. Dobry (a przynajmniej mam taką nadzieję) kurs OOP jest tutaj.

A co do Twojego przykładu to:
1) __construct() - pobiera dane nt. użytkownika i korzysta z sesji
Model to model. Użytkownik posiada dane na swój temat: id, name, email (na marginesie nie potrzebujesz prefixu user w atrybutach skoro klasa to User:P) i służy do obsługi logiki dotyczącej użytkownika, czyli metody takie jak: isAdmin(), isBlocked(), getEmailAdderess() są jak najbardziej na miejscu. UserLogin() i UserLogout() już nie. Metody modelu powinny dostarczać/ustawiać informacje na jego temat, wykonywać operacje na nim. Metody Logout() i Login() nie wykonują operacji na użytkowniku, a na aplikacji.

2) GetUserData() - to dego powinieneś stworzyć klasę np UsersManager z metodą getUser($id) i ona powinna Ci zwrócić gotowego użytkownika. Nie powinieneś mieszać logiki (użytkownik) ze sposobem przetrzymywania danych. Teraz jest to baza danych, ale pewnego dnia może dojdziesz do wniosku, że lepsze będą pliki XML?

3) UserLogin() i UserLogout() - o tym było przy okazji konstruktora:)

4) SetNewUser($user, $email, $pass, $pass2)
Po pierwsze walidacja powinna być wcześniej, chociaż to zależy od podejścia, które stosujesz:) Jednak na tym etapie radzę jednak stosować walidację przed tworzeniem instancji modeli.
To konstruktor powinien dostać parametry $user (a raczej $name?), $email i $pass. Ewentualnie, jeżeli chciałbyś użytkownika zapisać w bazie, to powinieneś w tym celu skorzystać z klasy UsersManager i metody save(User $user)

5) IsUserOnline()
Czyli, czy jest zalogowany. Od tego typu rzeczy powinieneś mieć mechanizm kontroli dostępu. I powinno to być sprawdzone wcześniej. Jeżeli dostęp do określonego miejsca może mieć tylko użytkownik zalogowany, to każdy inny powinien dostać odpowiedni komunikat. Z tym, że za to nie odpowiada użytkownik tylko aplikacja.
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.