Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> prawidlowe OOP , struktura klasy, Jak wedlug koncepcji OOP napisac dobra klase
rahul
post
Post #1





Grupa: Zarejestrowani
Postów: 71
Pomógł: 0
Dołączył: 5.03.2011

Ostrzeżenie: (0%)
-----


Witam
Temat pewnie wam znany i stary jak swiat. Pisze sobie swoj cms starajac sie zrobic to obiektowo. Dotychczas przejrzalem i przeczytalem wiele artykulow dotyczacych OOP i robie sie coraz glupszy bo z tego co rozumie to zastosowan jest multum, tylko ktore to najlepsze. mam taka klase

  1. include_once('db/db.php');
  2. class User
  3. {
  4. private $user_id;
  5. private $first_name;
  6. private $last_name;
  7. private $login;
  8. private $password;
  9. private $email;
  10. private $ip;
  11. private $user_role;
  12. private $registration_date;
  13. private $db;
  14.  
  15. function __construct()
  16. {
  17. $this->db = Database::getInstance();
  18. }
  19.  
  20. function setLogin($login)
  21. {
  22. $this->login = $login;
  23. }
  24.  
  25. function setPassword($password)
  26. {
  27. $this->password = $password;
  28. }
  29.  
  30. function setFirstName($firstName)
  31. {
  32. $this->firstName = $firstName;
  33. }
  34.  
  35. function setLastName($lastName)
  36. {
  37. $this->lastName = $lastName;
  38. }
  39.  
  40. function setEmail($email)
  41. {
  42. $this->email = $email;
  43. }
  44.  
  45. function setUserRole($role)
  46. {
  47. $this->role = $role;
  48. }
  49.  
  50. function setRegistrationDate($registration_date)
  51. {
  52. $this->registration_date = $registration_date;
  53. }
  54.  
  55.  
  56. function login()
  57. {
  58. $action = $this->db->prepare("SELECT * from users WHERE login LIKE '$this->login'
  59. AND password LIKE '$this->password'");
  60. $action->execute();
  61. $result = $action->fetchAll();
  62. if(count($result)== 1)
  63. {
  64. if($result[0]['Role'] == 0)
  65. {
  66. $_SESSION['user_id'] = $result[0]['user_id'];
  67. return true;
  68. }else if($result[0]['Role'] == 1)
  69. {
  70. $_SESSION['user_id'] = $result[0]['user_id'];
  71. $_SESSION['admin'] = 'admin';
  72. header('location:admin.php');
  73. }
  74. }
  75. return false;
  76. }
  77.  
  78. function register()
  79. {
  80. $ip = $_SERVER['REMOTE_ADDR'];
  81. $action = $this->db->query( "INSERT into users(user_id , Login , Password , Name , LastName ,Email , Ip , Role , RegistrationDate)
  82. VALUES('' , '$this->login' ,'$this->password' , '$this->firstName' , '$this->lastName' , '$this->email' , '$ip' ,
  83. '$this->role' , NOW())");
  84. $action->execute();
  85. return true;
  86. }
  87.  
  88. function EditUser()
  89. {
  90. ...
  91. }
  92.  
  93. function ChangePassword()
  94. {
  95. ...
  96. }
  97. } // end of class.
  98. ?>


Pierwsze pytanie : Czy klasa User powinna miec funkcje takie jak Loguj, Rejestruj, Edytuj, Zmien Haslo i czy te funckje powinny miec juz "hardcoded" zapytania do bazy wewnatrz, patrz funckja loguj();. Wywoluje ja tak:

  1.  
  2. $user_c = new User();
  3. $user_c->setLogin($_POST['login']);
  4. $user_c->setPassword(md5($_POST['password']));
  5. $login = $user_c->login();


Jezeli cos tego pokroju jest ok to spoko. Teraz np dopisalem sobie taka funkcje to tej samej klasy, ktora jak dla mnie moglaby byc w kazdej prawie innej klasie :

  1. class User {
  2.  
  3. private $sqlObj;
  4. private $SqltableRows;
  5.  
  6. function query($query)
  7. {
  8. $sql = $this->db->query($query);
  9. $sql->execute();
  10. $this->sqlObj= $sql->fetchAll(PDO::FETCH_OBJ);
  11. $this->SqltableRows= $sql->fetch(PDO::FETCH_ASSOC);
  12. }
  13. }


Dzieki tej funkcji lapie sobie wszystko z bazy i w prosty sposob moge wywolywac wszystkie kolumny :
  1. $user_c = new User();
  2. $user_c->query("SELECT * FROM users");
  3. $users = $user_c->getObj();
  4. foreach ($users as $user)
  5. {
  6. echo $user->Name;
  7. echo $user->Password;
  8. }


Bardzo podoba mi sie mozliwosc poboru rekordow i nazw wierszy tabeli w tak prosty sposob. Teraz do rzeczy :
Funckja ta jest w Users ale generalnie moglaby byc w prawie kazdej innej klasie, np Products, Articles itp. Czy mam utworzyc osobna klase z ta funckja z ktorej jakos beda kozystac wszyskie inne klasy ? Czy ma byc to w klasie bazy danych, czy moze w jakies jeszcze innej ?

Prosze o odpowiedzi i wyrozumialosc (IMG:style_emoticons/default/smile.gif)


Ten post edytował rahul 20.08.2011, 20:50:56
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Noidea
post
Post #2





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

Ostrzeżenie: (0%)
-----


1. Nic nie stoi na przeszkodzie, żeby UserManager zarządzał wieloma użytkownikami. Nie musisz tworzyć nowego obiektu dla każdego usera. Jeśli natomiast chcesz tworzyć UserManagera dla każdego użytkownika, to po co ci klasa User. Równie dobrze zamiast:
  1. $userId = 1234;
  2.  
  3. $user = new User($userId); // tworze obiekt User o podanym id, może być nie istniejące
  4. $userManager = new UserManager($user);
  5.  
  6. // Mógłbyś pisać:
  7. $userManager = new UserManager( $userId );

2. W związku z pkt. 1 nie możesz już przekazywać obiektu User w konstruktorze UserManagera. Zamiast tego będziesz musiał poinformować metodę getData() o jakiego użytkownika ci chodzi.
3. Nie wiem czym się u ciebie różni user od userData, ale moim zdaniem jest to zbędne rozgraniczenie

Po oczyszczeniu kodu ze zbędnych instrukcji, zostanie ci pewnie coś w rodzaju:
  1. $userManager = new UserManager($userId);
  2. $userData = $userManager->getData();
  3.  
  4. $userManager->changePassword('abc123');
  5. $userManager->save();
  6. $userDataNew = $userManager->getData();

Jak widzisz jedynymi informacjami jakie przekazujesz tutaj w parametrach jest ID użytkownika i hasło. Jak się pewnie domyślasz, obok DI to to nawet nie stało (IMG:style_emoticons/default/smile.gif)

Dla porównania podaję zalążek kodu wykorzystania (a przynajmniej tego, jak ja to widzę) klasy UserManager, korzystającej z PDO oraz logującej błędy:
  1. <<?php
  2.  
  3. interface ILogger
  4. {
  5. function Log( $message );
  6. }
  7.  
  8. class TxtLogger implements ILogger
  9. {
  10. public function __construct( $filePath )
  11. { /*...*/}
  12.  
  13. public function Log( $message )
  14. { /* Zapisuje wiadomość do pliku ... */ }
  15. }
  16.  
  17. class NullLogger implements ILogger
  18. {
  19. public function Log( $message )
  20. {
  21. return; // ignoruje wiadomość (nie zapisuje jej nigdzie)
  22. }
  23. }
  24.  
  25. class User { /* kontener na dane użytkownika */ }
  26.  
  27. class UserManager
  28. {
  29. private $db;
  30. private $logger;
  31.  
  32. public function __construct( PDO $db, ILogger $logger )
  33. {
  34. $this->db = $db;
  35. $this->logger = $logger;
  36. }
  37.  
  38. public function getDataById( $userId )
  39. {
  40. // Pobierz dane na temat użytkownika z bazy danych.
  41. // Jeśli znaleziono użytkownika o podanym ID, utwórz, wypełnij i zwróć obiekt klasy User
  42. // W przeciwnym wypadku zapisz informację o błędzie przy użyciu loggera i rzuć wyjątek
  43. }
  44. }
  45.  
  46. $mysqlDb = new PDO( "blablabla" );
  47. $userManager = new UserManager( $mysqlDb, new NullLogger() ); // Utworzenie managera użtykowników, korzystającego z bazy MySQL i nie logującego błędów
  48.  
  49. ?>


Go to the top of the page
+Quote Post

Posty w temacie
- rahul   prawidlowe OOP , struktura klasy   20.08.2011, 20:43:29
- - Noidea   CytatPierwsze pytanie : Czy klasa User powinna mie...   21.08.2011, 08:10:16
- - rahul   Dzieki za odpowiedz. Mam szereg nastepnych pytan....   21.08.2011, 10:43:14
- - Crozin   To z czym masz tutaj do czynienia to mapowanie obi...   21.08.2011, 13:10:42
- - rahul   CytatObiekty różnych typów zajmują się różnymi rze...   22.08.2011, 15:59:51
- - Crozin   1. Coś w ten deseń. Mając przykładowo obiekt User ...   22.08.2011, 17:00:00
- - rahul   Dzieki Crozin, szczegolnie za cierpliowac , tak so...   22.08.2011, 17:29:34
- - melkorm   OOP - sam miałem z tym wiele problemów na początku...   22.08.2011, 17:54:10
- - rahul   Taaaa... wlasnie pisze swojego cms'a po raz 2...   22.08.2011, 18:28:15
- - by_ikar   Zamiast tworzyć ileś tam tych seterów i geterów, m...   22.08.2011, 22:11:44
- - Crozin   @by_ikar: Zerowe wsparcie ze strony IDE czy narzęd...   22.08.2011, 22:50:44
- - by_ikar   Nie wiem z jakiego ID korzystasz, ale mój podpowia...   22.08.2011, 23:12:56
- - starach   Metody magiczne i po problemie. [PHP] pobierz, p...   22.08.2011, 23:17:38
- - Crozin   Mając 70 publicznych właściwości w obiekcie get*()...   22.08.2011, 23:25:43
- - melkorm   To jeżeli już tym torem idziemy to zrobić to jak m...   22.08.2011, 23:27:39
- - starach   Hmm, a możecie napisać co wy macie przeciwko tej m...   22.08.2011, 23:31:21
- - Crozin   A po co korzystać z metod magicznych skoro: [PHP] ...   22.08.2011, 23:53:50
- - starach   Jest jeden argument za tym żeby je właśnie stosowa...   23.08.2011, 01:06:16
- - Crozin   @starach: Pierwszy przykład to przykład poprawnie ...   23.08.2011, 02:14:01
- - melkorm   Jestem absolutnie za Crozin'em, wchodząc w źró...   23.08.2011, 02:51:29
- - by_ikar   CytatAle sam także jestem przeciwnikiem __set i __...   23.08.2011, 07:38:25
- - Noidea   @by_ikar Dyskusja o getterach i setterach wyszła o...   23.08.2011, 08:53:49
- - rahul   Rozumiem. Ze wzorca mvc poki co nie kozystam, to c...   23.08.2011, 09:20:07
- - by_ikar   KodDyskusja o getterach i setterach wyszła od klas...   23.08.2011, 09:24:43
- - melkorm   @by_ikar, to o czym mówisz to inna baja wtedy robi...   23.08.2011, 09:43:14
- - Crozin   @by_ikar: Pisałem to już wcześniej... temat jest o...   23.08.2011, 10:04:13
- - mike   ~by_ikar zainteresuj się takim pojęciem jak kohezj...   23.08.2011, 10:14:24
- - rahul   CytatOK, widzę że nie zrozumiałeś. Mając 70 public...   23.08.2011, 10:14:42
- - by_ikar   Kod@by_ikar: Pisałem to już wcześniej... temat...   23.08.2011, 10:31:38
- - rahul   Podsumowanie lekcji ... czyli co , bedzie to tak ...   23.08.2011, 18:39:35
- - starach   Blisko, nawet bardzo. Tylko getByUserId do drugiej...   23.08.2011, 19:06:56
- - rahul   no to klawo, mam nadzieje ze reszta mozgowcow tez ...   24.08.2011, 08:31:42
- - Crozin   1. Po co obiektowi User dostęp do bazy danych? Dla...   24.08.2011, 09:17:59
- - rahul   CytatPo co obiektowi User dostęp do bazy danych? D...   24.08.2011, 10:08:24
- - thek   A nie pomyślałeś, że UserManager poprzez zarządzan...   24.08.2011, 11:33:50
- - rahul   @thek - Czy zatem obiekt zwrocony z funckji UserMa...   24.08.2011, 12:02:00
- - Crozin   W skrócie:[PHP] pobierz, plaintext class User ...   24.08.2011, 13:04:55
- - thek   Pomyśl nad tym co chcesz osiągnąć... Jak dla mnie ...   24.08.2011, 13:09:08
- - melkorm   Jak najbardziej popieram wizję Thek'a, [PHP] ...   24.08.2011, 13:22:26
- - Crozin   @thek, @melkorm: Przy kodzie: $user = new Use...   24.08.2011, 13:41:42
- - rahul   @Crozin - No to takie cos napisalem, czyli nowy o...   24.08.2011, 14:06:57
- - thek   @Crozin: niekoniecznie ze stanu globalnego. Kto mi...   24.08.2011, 17:05:20
- - smentek   Chciał bym się odnieść do paru perełek: 1. Metody...   24.08.2011, 20:14:52
- - rahul   Ey ziomeczki, a nakierujcie mnie prosze w kwesti n...   25.08.2011, 00:32:14
- - Fifi209   Napisz klasę, która będzie obserwować obiekt, jak ...   25.08.2011, 00:52:55
- - rahul   no jo, ale nie bardzo wiem jak   25.08.2011, 01:20:32
- - Noidea   @Fifi209 Moim zdaniem bez sensu. Przy zmianie kilk...   25.08.2011, 08:02:24
- - rahul   a no, jak tak to bez problemu. Kontynuujac - Cz...   26.08.2011, 22:13:56
|- - starach   Cytat(rahul @ 26.08.2011, 23:13:56 ) ...   27.08.2011, 01:16:53
- - Sajrox   Chciałbym poćwiczyć technikę 'Dependency Injec...   5.09.2011, 11:16:50
- - Noidea   1. Nic nie stoi na przeszkodzie, żeby UserManager ...   6.09.2011, 09:04:14
- - Sajrox   Wydaje mi się że poniższe rozwiązanie nie jest zby...   7.09.2011, 10:16:11
- - Noidea   CytatZawsze gdy chcemy utworzyć instancję klasy ...   7.09.2011, 12:36:48


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 5.10.2025 - 18:02