Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php OOP] Prosba o opinie nt. pierwszej klasy
phpion
post 17.07.2006, 20:14:14
Post #1





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.

Ten post edytował phpion.com 17.07.2006, 20:18:36
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 15)
Cysiaczek
post 17.07.2006, 20:36:55
Post #2





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
-Gość-
post 17.07.2006, 20:45:22
Post #3





Goście







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).
Go to the top of the page
+Quote Post
phpion
post 17.07.2006, 20:47:28
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




To bylem ja - nie wiem dlaczego mnie wylogowalo...
Go to the top of the page
+Quote Post
Ludvik
post 17.07.2006, 20:50:15
Post #5





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


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


--------------------
Go to the top of the page
+Quote Post
Cysiaczek
post 17.07.2006, 20:57:02
Post #6





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




@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


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
Ludvik
post 17.07.2006, 21:05:44
Post #7





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


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...


--------------------
Go to the top of the page
+Quote Post
TomASS
post 17.07.2006, 22:49:09
Post #8





Grupa: Zarejestrowani
Postów: 1 660
Pomógł: 13
Dołączył: 9.06.2004
Skąd: Wrocław i okolice

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


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

Ten post edytował TomASS 17.07.2006, 22:49:42


--------------------
Go to the top of the page
+Quote Post
-Gość-
post 18.07.2006, 08:15:46
Post #9





Goście







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...
Go to the top of the page
+Quote Post
phpion
post 18.07.2006, 08:16:45
Post #10





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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
Go to the top of the page
+Quote Post
Cysiaczek
post 18.07.2006, 08:53:37
Post #11





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




@phpion - Nie - teraz $_SESSION nie jest przekazana, tylko użyta w konstruktorze. Przekazać trzeba jako argument konstruktora. guitar.gif


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
phpion
post 18.07.2006, 20:31:43
Post #12





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




No racja smile.gif
Go to the top of the page
+Quote Post
acztery
post 18.07.2006, 21:34:29
Post #13





Grupa: Zarejestrowani
Postów: 945
Pomógł: 7
Dołączył: 15.03.2005
Skąd: katowice

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


ja bym popracował nad nazewnictwem zmiennych , klass itp itd
Go to the top of the page
+Quote Post
phpion
post 19.07.2006, 09:35:15
Post #14





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Tzn? wszystko mam jechac po angielsku? smile.gif
Go to the top of the page
+Quote Post
Cysiaczek
post 19.07.2006, 09:39:55
Post #15





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
nasty
post 19.07.2006, 10:22:27
Post #16





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


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
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 10:43