Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Logowanie (pierwsza klasa)
Forum PHP.pl > Forum > PHP > Object-oriented programming
Bent
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?
MateuszS
Sam ucze sie OOP ale wg mnie nie powinno byc w zadnej metodzie ani troche HTMLa. Powinienes zrobic osobny plik .phtml z formularzem i go dolaczyc includem. No i nie wiem po co przypisales atrybutowi name wartosc ze zmiennej, zmienna, czyli jak sama nazwa wskazuje, moze sie zmieniac (jej wart.), a nie wiem w jakim celu zmieniac name inputa, a wartosci POSTa mozna przeslac osobnymi metodami typu setLogin i setPassword
Bent
Cytat
No i nie wiem po co przypisales atrybutowi name wartosc ze zmiennej, zmienna, czyli jak sama nazwa wskazuje, moze sie zmieniac (jej wart.), a nie wiem w jakim celu zmieniac name inputa, a wartosci POSTa mozna przeslac osobnymi metodami typu setLogin i setPassword


Nie bardzo wiem, o co Ci chodzi. Jeśli o to:

Kod
<td>Login: </td><td><input type="text" name="<?php echo $this -> login; ?>" /></td>
</tr>
<tr>
<td>Hasło: </td><td><input type="text" name="<?php echo $this -> password; ?>" /></td>


Chodziło mi o to, żeby skrypt był bardziej uniwersalny.
MateuszS
No ok, ale po co ktos by chcial zmieniac name pol? Moze jest w tym jakis cel, ale ja go nie znam i nie rozumiem tongue.gif
darko
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.
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-2024 Invision Power Services, Inc.