Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [skrypt] Klasa logowania i rejstracji
Forum PHP.pl > Inne > Oceny
gcdreak
Witam!<br>Kiedyś stworzyłem klasę logowania. Zaczynam dopiero przygodę z OOP. Proszę o Waszą opinie i jakieś rady. Moja klasa:
http://wklej.org/id/101767/
NuLL
Pytanie jaki zwiazek ma uruchamianie sesji oraz laczenie sie z baza danych z samym logowaniem ? Te funkcjonalnosci zupelnie do tej klasy nie pasuja. Pomysl - co tak naprawde powinna zawierac klasa do logowania - tak naprawde TYLKO to co jest zwiazane z logowanie uzytkownika smile.gif
gcdreak
Tak, masz rację. A pozatym to co jeszcze myślicie o tej klasie? Zależy mi, żeby się od was dowiedzieć istotnych rzeczy dotyczących tworzenia systemu kontoroli autoryzacji. Może ktoś mi dokładnie powie, jak to powinno wyglądać bo już któryś dzień przeglądam www i ciężko jest znaleść coś sensownego i OO.
NuLL
http://phpgacl.sourceforge.net/ - polecam zapoznanie sie winksmiley.jpg
gcdreak
To cały system, który nie jest mi zbyt potrzebny. Ponadto chcę się nauczyć.
marcio
http://wklej.org/id/101896/txt ja kiedys dla cwiczen tak to napisalem jednak teraz bym zmienil 2 rzeczy ale ogolnie klasa jest good jak chcesz to zobacz tongue.gif

Oczywiscie dla rejestracji i bazy danych mam osobne klasy.
gcdreak
No ciekawie to wygląda.
Ja w między czasie zacząłem tworzyć coś nowego. Proszę o uwagi i pewnie wielu powie, że powninienem odseparować połączenie z bazą. Niestety nie bardzo wiem jak to zrobić, ponieważ przeważnie mam z implementacją jednej klasy w drugiej. Jeśli by komuś się chciało to byłbym bardzo wdzięczny gdyby mi pokazał jak to napisać. Oto kod: http://wklej.org/id/101976/
marcio
Po pierwsze funckja zarejestruj powinna byc w innej klasie to raz.

Dwa to co masz w costruct daj do klasy o nazwie Db czyli taki maly zarys jak to powinno wygladac:
  1. <?php
  2. class DB { public function connect() {
  3.  
  4.        if(!self::$db) {
  5.  
  6.            self::$db = @new mysqli('localhost', 'user', 'pass', 'base');
  7.  
  8.            if(@ self::$db->connect_errno) {
  9.  
  10.                     throw new Exception('Nie można połączyć się z bazą danych.');
  11.            }
  12.  
  13.        }
  14.  
  15.                else {
  16.            return self::$db;
  17.  
  18.        }
  19.  
  20.    }
  21.  
  22. }
  23.  
  24.  
  25. //tutaj twoja klasa Autoryzcja bez funckji zarejestruj z mala modyfikacja:
  26.  
  27. class Autoryzacja {
  28.  
  29. private $db;
  30.  public function __construct(DB $db) { przekazujesz obiekt bazy danych
  31.                                                                              
  32.    $this -> db = $db;
  33.    $this -> db -> connect(); // operujesz na przekazanym obiekcie
  34.    
  35. }
  36.  
  37. //i tutaj ta twoja funkcja zaloguj/wyloguj
  38.  
  39.  
  40. public function __construct(DB $db) {
  41.  
  42.    unset($this -> db);
  43.    
  44. }
  45.  
  46. }
  47. ?>

A rejestracja ma byc w osobnym pliku.

Tak mniej wiecej oczywiscie.

Aha o potem oczywiscie robisz tak:
  1. <?php
  2. $user = new Autoryzacja(new DB); // i potem reszta normalnie $user -> funkcja();
  3. ?>
gcdreak
Kod
public function __construct(DB $db) {
  
    unset($this ->db);
      
    }


1.A dlaczego to jest tak? Dlaczego są dwa konstruktor?
2.Jeśli tworzę klasę rejstracja to poza samą rejstracją chcę w niej umieścić metody odzyskajHaslo(). Jakie jeszcze powinienem w niej umieścić metody?
marcio
Cytat(gcdreak @ 7.06.2009, 08:40:48 ) *
Kod
public function __construct(DB $db) {
  
     unset($this ->db);
        
     }


1.A dlaczego to jest tak? Dlaczego są dwa konstruktor?
2.Jeśli tworzę klasę rejstracja to poza samą rejstracją chcę w niej umieścić metody odzyskajHaslo(). Jakie jeszcze powinienem w niej umieścić metody?

Sorki literowka mial byc __destruct() tongue.gif poprostu na szybko pisalem.

Nom ogolnie co robia zawsze klasy rejestracji dodaja user'a i ewentualnie odzsykuja jego stare haslo potem jak to sobie juz zaimplementujesz to juz twoja sprawa czy bedziesz uzywal gettery/settery czu pola publiczne lub arg. funckji by ustawiac dane.

Zrob pokaz a my ci powiemy co i jak.
Moli
  1. <?php
  2. #
  3.  
  4. function __get($var){
  5.  
  6. #
  7.  
  8.            return $this->$var;
  9.  
  10. #
  11.  
  12.        }
  13.  
  14. #
  15.  
  16.        
  17.  
  18. #
  19.  
  20.        function __set($var, $val){
  21.  
  22. #
  23.  
  24.            $this->$var = $val;
  25.  
  26. #
  27.  
  28.        }
  29. ?>

Bez sensu smile.gif
Kildyt
Ale bajerujesz z komentarzami. tongue.gif Nie wystarczy jedno liniowy bez gwiazdek?
Używaj angielskim nazw funkcji, zmiennych itp.
Może spodobają ci się skrócone warunki?
Nie lepiej włączyć sesje w konstruktorze?
Polecam error_reporting(E_ALL).
gcdreak
@Moli
co Ci w tym nie pasuje?

Cytat(Kildyt @ 7.06.2009, 14:14:43 ) *
Używaj angielskim nazw funkcji, zmiennych itp.
Postanowiłem ten projekt zrealizować używając polskich nazw. Wszyscy używają angielskich i nie mówię, że to jest złe bo ang. to język programowania i dla wszystkich czytelne jest. Należy jednak zauważyć, że tego kodu będę używał tylko ja, a jeśli ktoś inny by chciał poużywać to i tak będzie to Polak.

Cytat(Kildyt @ 7.06.2009, 14:14:43 ) *
Może spodobają ci się skrócone warunki?
Możesz mi to dokładniej wytłumaczyć? Dać przykład?

Cytat(Kildyt @ 7.06.2009, 14:14:43 ) *
Nie lepiej włączyć sesje w konstruktorze?
Do sesji zrobię osobną klasę i pewnie zamieszcze ją, aby sie od Was dowiedzieć co można by zrobić lepiej. Może nawet dzisiaj ją wrzucę.

Cytat(Kildyt @ 7.06.2009, 14:14:43 ) *
Polecam error_reporting(E_ALL).
W php.ini mam:
Kod
error_reporting  =  E_ALL|E_STRICT & ~E_NOTICE
Kildyt
Cytat(gcdreak @ 7.06.2009, 15:49:03 ) *
Możesz mi to dokładniej wytłumaczyć? Dać przykład?

Zamiast:
  1. <?php
  2. if(mysqli_errno($db)){
  3.  return false;
  4. }else{
  5.  return true;
  6. }
  7. ?>


masz:
  1. <?php
  2. if(mysqli_errno($db))
  3.  return false;
  4. else
  5.  return true;
  6. ?>

Osobiście dla mnie taki układ jest bardziej czytelny.


Co do angielskich nazw, to należy stosować się do tej zasady zawsze, nawet wtedy gdy programuje się tylko dla siebie ponieważ dobre nawyki trzeba u siebie wyuczyć od samego początku.
phpion
@Kildyt:
Jeśli usunięcie 4 znaków sprawia, że kod jest dla Ciebie bardziej czytelny to spoko smile.gif Jak już bawimy w skracanie warunków to można tak:
  1. <?php
  2. return mysqli_errno($db) ? false : true;
  3. ?>

lub wręcz:
  1. <?php
  2. return (bool)mysqli_errno($db);
  3. ?>
gcdreak
@Kildyt:
Można i tak, ale to jest objętne, przeważnie piszę nawiasy.
Cytat(phpion @ 7.06.2009, 16:17:02 ) *
  1. <?php
  2. return (bool)mysqli_errno($db);
  3. ?>

Ciekawy sposób.

Zrobiłem klasę obsługi sesji:
Kod
session_start();

class ObslugaSesji
{
    
    private $login;


    public function __construct($login){
        $this->login = $login;
    }
    
    
    public function rozpocznijSesje(){
        if(!isset($_SESSION['zalogowany'])){
            $_SESSION['zalogowany'] = true;
            $_SESSION['login'] = $this->login;
        }else{
            session_regenerate_id();
        }
        return true;
    }

    
    public function zakonczSesje(){
        $zalogowany = $_SESSION['zalogowany'];
        session_destroy();
        unset($_SESSION['zalogowany'], $_SESSION['login']);
        if(!empty($zalogowany))
            return true;
        else
            return false;
    }
}


Teraz trochę o zastosowaniu tego.
1. W klasie Autoryzacja mam metodę wyloguj(). Myślałem, żeby do tej metody dopisać odniesienie do metody zakonczSesje() z klasy ObsługaSesji.
Jak to piwinienem zrobić?
2. W klasie Autoryzacja mam metodę zaloguj(). Myślałem, żeby do tej metody dopisać odniesienie do metody rozpocznijSesje() z klasy ObsługaSesji.
Jak to piwinienem zrobić?

Poza tym to co byście ewentualnie zmienili w tej klasie?
Kildyt
Cytat(phpion @ 7.06.2009, 16:17:02 ) *
@Kildyt:
Jeśli usunięcie 4 znaków sprawia, że kod jest dla Ciebie bardziej czytelny to spoko smile.gif Jak już bawimy w skracanie warunków to można tak:
  1. <?php
  2. return mysqli_errno($db) ? false : true;
  3. ?>

lub wręcz:
  1. <?php
  2. return (bool)mysqli_errno($db);
  3. ?>


No mam tak. biggrin.gif Ściśle staram się zachować przejrzystość kodu, tabulację i usunięcie dwóch linijek, w którym są same klamry czynią, że kod wydaje się bardziej przejrzysty. winksmiley.jpg

Drugiego sposobu nie znam, ale i tak uważam, że oba nie powinno się stosować ponieważ są one trochę wyjęte z sufitu.
Moli
@gcdreak - Jak pisałem jest to bez sensu. Metody magiczne get i set, powinno się używać jeśli zmienne przetrzymujesz np. w tablicach. Czym będzie się różnić ten kod:
  1. <?php
  2.  
  3. class klasa
  4. {
  5.    public function __set($name,$value)
  6.    {
  7.        $this->{$name} = $value;
  8.    }
  9.  
  10.    public function __get($name)
  11.    {
  12.        return $this->{$name};
  13.    }
  14. }
  15.  
  16. $class = new klasa;
  17. $class->var = 'test';
  18. echo $class->var;
  19.  
  20. ?>

od tego:
  1. <?php
  2.  
  3. class klasa
  4. {
  5.    
  6. }
  7.  
  8. $class = new klasa;
  9. $class->var = 'test';
  10. echo $class->var;
  11.  
  12. ?>


Odpowiedź: Oprócz większego kodu - niczym.
gcdreak
To ciekawe co piszesz odnośnie metod magicznych, bo nigdy o tym nie słyszałem i dlatego trochę bez sensu (z tego wynika) ich użyłem.
Możesz podać jakiś przykład?

Proszę jeszcze o odpowiedź na moje pytania, które zamieściłem wyżej - odnośnie metod klasy ObslugaSesji
Moli
  1. <?php
  2.  
  3. class klasa
  4. {
  5.    public $Config=array();
  6.  
  7.    public function __set($name,$value)
  8.    {
  9.        $this->Config[$name] = $value;
  10.    }
  11.        
  12.    public function __get($name)
  13.    {
  14.        return $this->Config[$name];
  15.    }
  16. }
  17.  
  18. $class = new klasa;
  19. $class->var = 'test';
  20. echo $class->var;
  21. var_dump($class->Config);
  22. ?>

Oczywiście tablice to tylko prosty przykład. Zastosować metod magicznych jest wiele smile.gif
gcdreak
Jakie jeszcze są te zastosowania?

Proszę odpowiedźcie na pytania z pod tego: http://forum.php.pl/index.php?s=&showt...st&p=616751 postu
Moli
@gcdreak - To do mnie ten post ? Bo nie rozumiem smile.gif
gcdreak
@Moli
Tak do Ciebie
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.