Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php OOP] Prosba o opinie nt. pierwszej klasy
Forum PHP.pl > Forum > Przedszkole
phpion
Chcialbym was prosic o opinie i sugestie nt. mojej pierwszej klasy podczsa nauki OOP. Co mozna w niej poprawic, co nalezaloby napisac inaczej. Poczatek czyli laczenie z baza i ustawianie sesji jest tylko tymczasowo. Prosze o informacje co i jak. Do czego moglby sluzyc destruktor w tej klasie? Do zerowania atrybutow? Wogole nie widze wiekszego sensu destruktora w tym przypadku - moze sie myle, prosze mnie wiec oswiecic.
  1. <?php
  2. $sql = mysql_connect("localhost", "root", "");
  3. mysql_select_db("logowanie");
  4.  
  5.  
  6. $_SESSION['login'] = "phpion";
  7. $_SESSION['haslo'] = "haslo";
  8.  
  9. class Uzytkownik
  10. {
  11. private $login;
  12. private $haslo;
  13. private $grupa;
  14. private $zalogowany;
  15. private $dostep;
  16.  
  17. function __construct()
  18. {
  19. $this->login = (isset($_SESSION['login'])) ? $_SESSION['login'] : NULL;
  20. $this->haslo = (isset($_SESSION['haslo'])) ? $_SESSION['haslo'] : NULL;
  21. $this->grupa = 0;
  22. $this->zalogowany = $this->dostep = FALSE;
  23. }
  24.  
  25. function sprawdzZalogowanie()
  26. {
  27. if ($this->login != NULL && $this->haslo != NULL)
  28. {
  29. $q = "SELECT grupa FROM uzytkownicy WHERE BINARY login='".$this->login."' AND BINARY haslo='".$this->haslo."' AND stan='1'";
  30. $q = mysql_query($q);
  31.  
  32. if (mysql_num_rows($q) > 0)
  33. {
  34. $r = mysql_fetch_row($q);
  35.  
  36. $this->grupa = $r[0];
  37. $this->zalogowany = TRUE;
  38. }
  39. }
  40. }
  41.  
  42. function sprawdzDostep($typ, $lista)
  43. {
  44. $this->sprawdzZalogowanie();
  45.  
  46. if ($this->zalogowany == TRUE && $this->grupa != 0)
  47. {
  48. $tablica = explode(" ", $lista);
  49.  
  50. if (($typ == 1 && in_array($this->grupa, $tablica) || ($typ == 0 && !in_array($this->grupa, $tablica))))
  51. $this->dostep = TRUE;
  52. }
  53.  
  54. if ($this->dostep != TRUE)
  55. {
  56. header("Location: accessDenied.php");
  57. }
  58. }
  59. }
  60.  
  61. $uzytkownik = new Uzytkownik();
  62. $uzytkownik->sprawdzDostep(0, "1 2");
  63. ?>
  64. Tajna tresc

PS: w metodzie sprawdzDostep $typ moze byc 0 lub 1 (0 dla wylaczania dostepu dla grup, 1 dla udostepnianiu dla wskazanych grup) i liste grup podajemy jako ciag liczb oddzielonych spacja.
Cysiaczek
smile.gif PIerwsz klasa laugh.gif

No to jedziemy happy.gif :

1. Używasz globalnej tablicy $_SESSION wewnatrz klasy, co jest "be".
2. Oznaczyłeś jako prywatne $login i $haslo. No dobra. to po co Ci te składowe, skoro nie zamierzasz z nich korzystać? Brakuje takich metod jak getUserName() oraz getUserPass(), których możesz użyć do pozyskania informacji o użytkowniku. Domyślam się, że potem korzystasz po prostu z $_SESSION... po co? Masz przeciez klasę i tam masz dane uzytkownika. Wykorzystaj to.

Btw. Pierwsza klasa - Gratz smile.gif

Pozdrawiam.
Gość
Masz na mysli takie cos?
  1. <?php
  2. function getUserName()
  3. {
  4. $this->login = $_SESSION['login'];
  5. }
  6. ?>

W sumie to robie w konstruktorze... uzywanie $_SESSION w srodku klasy jest 'be' to jak mozna inaczej (lepiej) to rozwiazac? Zastosowanie klasy (klaski ;-) ) podalem w 2 ostatnich linijkach skryptu. Public, private, protected - jak najlepiej ustawic var'y klasy - nie do konca jeszcze czuje roznice zastosowac (teorie znam).
phpion
To bylem ja - nie wiem dlaczego mnie wylogowalo...
Ludvik
Cytat
1. Używasz globalnej tablicy $_SESSION wewnatrz klasy, co jest "be".

To nie jest tablica globalna... To jest tablica superglobalna, a to nie jest takie bardzo "be"...

Ja bym zmienił modyfikatory private na protected. Czasami przydaje się dziedziczenie przy takich klasach. Tak jak napisał Cysiaczek, napisz funkcje dostępu. Poza tym sesje są bezpieczne i nie musisz sprawdzać czy użytkownik istnieje co wywołanie strony. Co innego, gdybyś dane pozyskiwał z ciastka, które użytkownik może modyfikować.

Inna uwaga. Zapomnij o exitach w klasach! Nigdy czegoś takiego się nie robi. Możesz wyrzucić wyjątek, który sobie wyłapiesz i zrobisz wtedy co chcesz.

Tyle ode mnie. Nie jest źle smile.gif
Cysiaczek
@Ludvik - no dobra - nie takie bardzo "be", a jesli zechcę sobie (nie pytaj dlaczego) przenosić login i hasełko przez $_GET ? Czy to tak wiele kosztuje przekazanie $_SESSION["user"] i "pass" do konstruktora? worriedsmiley.gif
Ludvik
Oczywiście, że można. Tak nawet lepiej będzie. Ale to tylko koncepcja autora. Jeżeli chodzi o głębszą interpretację tej klasy to bym podzielił ją na dwie, albo nawet trzy, bo teraz za dużo ma "na głowie". Zajmuje się przenoszeniem danych użytkownika, pobieraniem ich oraz autoryzacją. Nie tędy droga. Jedna klasa musi przechowywać same dane i udostępniać interfejs, dzięki któremu można na nich operować. Druga klasa odpowiada za pobranie danych użytkownika z bazy i stworzenie obiektu. Trzecia klasa operuje na obiekcie użytkownik i porównuje jego prawa dostępu do wymagań. Tak wszystko będzie bardziej elastyczne. Ale nie można oczekiwać elastyczności po pierwszych rozwiązaniach...

Do autora wątku: Atrybuty klasy wypada izolować, aby zachować nad nimi kotrolę. Dostęp najlepiej zapewnić przez publiczne metody. Radzę zapoznać się z lekturą związaną z OOP. Np. Headfirst Design Patterns - dziwnie napisana książka, ale łatwo przyswajalna. Nie jest zła...
TomASS
1.
Cytat
Brakuje takich metod jak getUserName() oraz getUserPass()

Ja bym to załatwił metodami magicznymi __get i __set.

2.
co to będzie jak metodę zawierającą ten kod:
  1. <?php
  2. if ($this->dostep != TRUE){
  3. header("Location: accessDenied.php");
  4.  }
  5. ?>

wywoła się po wysłaniu nagłówka do przeglądarki? Spowoduje błąd. Tak jak podpowiadają koledzy, lepszym rozwiązaniem w tym wypadku będą wyjątki.

3.
metody też mogą być public/protected/private

4.
  1. <?php
  2. $q = "SELECT grupa FROM uzytkownicy WHERE BINARY login='".$this->login."'
  3. ?>

A co będzie jeśli w $this->login będzie login' OR 1 ? Mam nadzieję, że to gdzieś sprawdzasz (np. przy pomocy mysql_escape_string)
Zamiast w sesji przekazywać zmienne do klasy - przekazuj je poprzez konstruktora.

5.
Troszkę dla mnie dziwne jest pisanie metody, która ma za zadnie sprawdzenie czy użytkownik ma dostęp i jeśli nie to przładowuje się na inną stronę, a jeśli ma dostęp to "puszcza" skrypt.

Masz teraz tak:
  1. <?php
  2. $uzytkownik = new Uzytkownik(); //1
  3. $uzytkownik->sprawdzDostep(0, "1 2"); //2
  4. ?>
  5. Tajna tresc

Jeśli brak dostępu to w //2 przejdzie do innej strony.
Jeśli jest dostęp to "puści"

Ja bym to zrobił raczej tak, że metoda sprawdzDostep() zwraca czy jest dostęp czy brak dostępu:

  1. <?php
  2. $uzytkownik = new Uzytkownik();
  3. if($uzytkownik->sprawdzDostep(0, "1 2")){
  4.  echo 'Tajna treść';
  5. }
  6. else{
  7. echo 'Brak dostępu';
  8. }
  9. ?>



Na pierwszą funkcję jest na prawdę dobrze smile.gif Czekamy na jeszcze smile.gif
Gość
Ok, wszystko dokladnie przeczytalem. Wlasnie chodzilo mi o to jak to wszystko zgrabnie napsiac (ten podzial na 3 klasy - wlasnie o takie rady mi chodzilo!). Tak jak pisalem - jest to 1 klasa i w zasadzie wszystko bym do niej wpakowal tongue.gif a wiem ze nie tedy droga.
Cytat
Czy to tak wiele kosztuje przekazanie $_SESSION["user"] i "pass" do konstruktora

hmmm a to tak nie jest teraz?
Co do tego ze exit nie sa zbyt mile widziale w klasach - nie wiedzialem, dziekuje za info. Filtrowanie danych itd. na razie nie ma bo jak widac to klasa testowa z danymi umieszczonymi przeze mnie w kodzie wiec tym sie na razie zajmowal nie bede. Chodzi mi o sama klase. Natomiast co to samego dzialania skryptu:
Cytat
  1. <?php
  2.  
  3. $uzytkownik = new Uzytkownik();
  4.  
  5. if($uzytkownik->sprawdzDostep(0, "1 2")){
  6.  
  7.  echo 'Tajna treść';
  8.  
  9. }
  10.  
  11. else{
  12.  
  13. echo 'Brak dostępu';
  14.  
  15. }
  16.  
  17. ?>

Chcialem wlasnie to zrobic w jak najkrotszy sposob, zeby nie trzeba bylo wstawiac duzo kodu na kazdej chronionej podstronie. Stad takie rozwiazanie z exitem w srodku...
phpion
Znowu mnie kurAW wylogowalo angrysmiley.gif


---
Jak się kulturalnie odezwać nie potrafisz to nic nie pisz.
To jest forum publiczne a nie ławka pod blokiem.
Następnym razem dostaniesz ostrzeżenie i zakaz postowania na jakiś czas.
~mike_mech
Cysiaczek
@phpion - Nie - teraz $_SESSION nie jest przekazana, tylko użyta w konstruktorze. Przekazać trzeba jako argument konstruktora. guitar.gif
phpion
No racja smile.gif
acztery
ja bym popracował nad nazewnictwem zmiennych , klass itp itd
phpion
Tzn? wszystko mam jechac po angielsku? smile.gif
Cysiaczek
Niekonieczne, choć lepiej laugh.gif , bo ktoś z zagranicy będzie mógł odczytać twój kod. Poza tym szlifujesz w ten sposób angielski, co samo w sobie jest dobre smile.gif
nasty
i ja dozuce swoje 5 groszy: tongue.gif

Skorzystaj z okazji ze jeszcze nie masz zlych przyzwyczajen i nabiez dobrych, jak np komentowanie wszystkiego w formacie phpDoc
pozdrawian
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.