Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Logowanie (pierwsza klasa)
Bent
post
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 24.12.2009

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


Witam,

Dopiero zaczynam przygodę z OOP. Napisałem pierwszą taką klasę:

  1. class Users extends mysqli
  2. {
  3. private $login = 'login', $password = 'password', $submit;
  4.  
  5. private function showLogForm()
  6. {
  7. ?>
  8. <form method="post" action="">
  9. <table>
  10. <tr>
  11. <td>Login: </td><td><input type="text" name="<?php echo $this -> login; ?>" /></td>
  12. </tr>
  13. <tr>
  14. <td>Hasło: </td><td><input type="text" name="<?php echo $this -> password; ?>" /></td>
  15. </tr>
  16. <tr>
  17. <td></td><td><input type="submit" name="submit" value="Zaloguj!" /></td>
  18. </tr>
  19. </table>
  20. </form>
  21. <?php
  22. }
  23.  
  24. private function isSent($submit)
  25. {
  26. $this -> submit = $submit;
  27. if (isset($this -> submit))
  28. return true;
  29. else
  30. return false;
  31. }
  32.  
  33. private function isFilled()
  34. {
  35. foreach ($_POST as $key => $value)
  36. {
  37. if (!isset($key) || empty($value))
  38. return false;
  39. }
  40. return true;
  41. }
  42.  
  43. public function logIn()
  44. {
  45. if ($this -> isSent($_POST['submit']))
  46. {
  47. if ($this -> isFilled())
  48. echo 'OK';
  49. else
  50. echo 'Uzupełnij formularz!';
  51. }
  52. else
  53. {
  54. $this -> showLogForm();
  55. }
  56. }
  57.  
  58. }
  59.  
  60. $user = new Users;
  61. $user -> logIn();


Mam 2 pytania:

1. W mojej klasie metody wyświetlające formularz i sprawdzające go są typu private, metodą, która to wszystko ogarnia jest metoda logIn(). Czy to dobry pomysł? Czy może lepiej wszystkie te metody ustawić jako public i całość sprawdzać poza klasą po utworzeniu obiektu?

2. Czy dobrym pomysłem jest tworzenie metod wyświetlających formularze czy raczej do takich rzeczy się funkcji nie tworzy?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
darko
post
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Moim zdaniem klasa odpowiedzialna za logowanie powinna zawierać tylko logikę związaną z autentykacją użytkownika. U Ciebie wydaje się, że wszystko jest pomieszane ze sobą:
- masz klasę o nazwie Users - nazwa mylnie sugeruje, że klasa jest odpowiedzialna za zarządzanie jakąś kolekcją użytkowników
- ta klasa - oprócz wyplucia formularza - kompletnie nic nie robi
- walidacja formularza tylko na zasadzie czy wartości z pól formularza: login i pass są nie puste - to za mało (sprawdzaj długość loginu i hasła)
- metoda showLogForm jest kompletnie nieelastyczna, narzucasz z góry nazewnictwo pól formularza, nie ma możliwości zmiany atrybutu action, pole dla hasła powinno mieć typ password
- ciało metod isSent i isFilled można byłoby zastąpić dwiema liniami kodu
-
Rozumiem, że klasę będziesz rozbudowywał (jako, że dziedziczysz z klasy mysqli)
Ad.1
Sam mechanizm działania klasy jak najbardziej powinien być ukryty poprzez zastosowanie hermetyzacji, jednak zastanowiłbym się nad rozluźnieniem dostępu do metod z private do protected, dzięki temu można będzie je odziedziczyć w klasach potomnych (w przypadku private - nie można). Metody o dostępie prywatnym powinny wykonywać kod, którego nie chcemy udostępniać na zewnątrz, ani nie chcemy, aby klasy wyprowadzane z naszej klasy dziedziczyły określone zachowanie (i/lub właściwości).

Ad. 2
To naprawdę zależy od wielu czynników, ale generalnie nie powinno się umieszczać htmla w klasach.

// edit
chyba zupełnie zapomniałeś o jednej z podstawowych zasad bezpieczeństwa - nigdy nie ufać danym pochodzącym od użytkowników.

//edit2
Na razie nie ma jeszcze czego oceniać, dodaj konkretną implementację logowania + zabezpieczenia przed potencjalnymi zagrożeniami.

Ten post edytował darko 2.03.2010, 11:27:35
Go to the top of the page
+Quote Post

Posty w temacie


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: 11.10.2025 - 06:28