Witam, jestem początkujący w programowaniu obiektowym, wcześniej pisałem w strukturalnym. Chciałbym aby ktoś bardziej profesjonalny ocenił kod logowania w OOP napisany przeze Mnie. Opinie innych są dla mnie bardzo ważna. Nie korzystam z żadnego wzorca projektowego, po prostu chce przepisać kod strukturalny na obiektowy aby lepiej go zrozumieć.
<?php class database{ private $db_name = 'db_name'; private $db_user = 'db_user'; private $db_pass = 'db_pass'; private $db_host = 'db_host'; private $connect; function __construct(){ $this -> connect = new mysqli($this -> db_host,$this -> db_user,$this -> db_pass ,$this -> db_name); $this -> stan(); $this ->kodowanie_zapytania(); } private function stan(){ if($this -> connect -> connect_errno) throw new Exception('Połączenie z serwerem bazy danych nie powiodło się'); } private function kodowanie_zapytania(){ $wynik_zapytania=$this -> connect -> query ("SET NAMES 'utf8'"); if(!$wynik_zapytania) throw new Exception('Ustawienie Kodowanie Zapytanie Nie Udało się'); } public function query($zapytanie){ $zapytanie = $this -> connect -> query ($zapytanie); if(!$zapytanie) throw new Exception ('Wykonanie zapytania nie powiodło się'); return $zapytanie; } } class UserAuthorizer { private $connection; function __construct(){ $this -> connection = new database(); } public function logowanie($login, $password) { $wynik_zapytania = $this-> connection -> query("SELECT password FROM users where login='".$login."'"); if(!$wynik_zapytania->num_rows) throw new Exception('Podany uzytkownik nie istnieje '.$login); $wiersz = $wynik_zapytania->fetch_assoc(); if(!password_verify ($password,$wiersz['password'])) throw new Exception("Hasła nie sa takie same"); } } try{ $egzemplarz = new UserAuthorizer(); $egzemplarz -> logowanie('login','haslo'); } catch(Exception $e){ http://www.php.net/echo $komunikat=$e->getMessage(); } ?>
1. Używaj tylko angielskich nazw
2. Formatuj ładnie kod (https://www.php-fig.org/psr/psr-2/)
3. Nie twórz klas które są "aliasami" innych klas - klasa database nic nie wnosi.
4. Nie twórz klas w konstruktorach tylko je "wstrzykuj" - czytaj o DI (to wzorzec, w OOP jest dużo wzorców bez nich OOP nie ma sensu na dłuższą mete).
5. Używaj PHP 7.2 (silne typowanie itp.)
6. Używaj phpunit/phpspec - naucz się pisać testy
7. Używaj namespace`ów i composera (https://www.php-fig.org/psr/psr-4/)
1. Poczytaj o PSR
2. Koduj po angielsku Nie wazne, ze teraz robisz to tylko dla siebie, jak wejdzie Ci w nawyk, to nie bedziesz sie musial przestawiac.
3. Nazwa klasy 'database' nie bardzo mi sie podoba. Raczej bym tutaj wstawil cos w stylu DatabaseConnection
4. Dane do polaczenia warto by bylo wyciagnac poza klase - zeby mozna jej bylo uzywac w wielu projektach / polaczeniach bez potrzeby zmian.
5. Zmienne do zapytan sie binduje, poczytaj o SQL Injection
To tak na szybko
Pozwol ze przeniose. Twoj problem z OOP nie ma zadnego zwiazku nachwile obecna
Dziękuje za pomoc, temat do zamknięcia
Czemu do zamkniecia ? Wprowadz poprawki, wrzuc nowa wersje i jedziemy dalej
<?php class DatabaseConnection { private $db_name = 'db_name'; private $db_user = 'db_user'; private $db_pass = 'db_pass'; private $db_host = 'db_host'; private $connect; function __construct() { $this->connect = new mysqli($this->db_host,$this->db_user,$this->db_pass ,$this->db_name); $this->error_connect_database(); $this->set_query_utf8(); } private function error_connect_database() { if($this->connect->connect_errno) throw new Exception('Połączenie z serwerem bazy danych nie powiodło się'); } private function set_query_utf8() { $wynik_zapytania=$this->connect->query("SET NAMES 'utf8'"); if($wynik_zapytania === false) throw new Exception('Ustalenie kodowania połączenia z Bazą danych MySql nie powiodło się'); } public function prepare_query($query) { $result_prepare=$this->connect->prepare($query); if($result_prepare === false) throw new Exception('Wykonanie zapytania nie powiodło się'); return $result_prepare; } } class UserAuthorizer { protected $connection; function __construct($connect) { $this->connection=$connect; } public function authorize($login, $password) { $result_query=$this->connection->prepare_query("SELECT password FROM users where login = ?"); $result_query->bind_param("s", $login); $result_query->execute(); $result_query->bind_result($password_from_database); $row = $result_query->fetch(); if (http://www.php.net/empty($row)) { throw new Exception('Użytkownik o podanym loginie nie istnieje.'); } if (password_verify($password, $password_from_database) === false) { throw new Exception('Błędne hasło.'); } } } try { $connect=new DatabaseConnection(); //DI wstrzykiwanie zaleznosci $egzemplarz=new UserAuthorizer($connect); $egzemplarz->authorize('login','password'); } catch(Exception $e){ http://www.php.net/echo $komunikat=$e->getMessage(); } ?>
1. Używaj tylko angielskich nazw (wyjątki dalej po PL)
2. Formatuj ładnie kod smile.gif (https://www.php-fig.org/psr/psr-2/) (nadal brak formatowania)
3. Nie twórz klas które są "aliasami" innych klas - klasa database nic nie wnosi. (nadal klasa DatabaseConnection nie robi za dużo, wystarczy użyć wbudowanego np. PDO i ta klasa nie jest potrzebna)
4. Nie twórz klas w konstruktorach tylko je "wstrzykuj" - czytaj o DI (to wzorzec, w OOP jest dużo wzorców bez nich OOP nie ma sensu na dłuższą mete). (Jeszcze brakuje wstrzyknięcia niektórych zależności w DatabaseConnection)
5. Używaj PHP 7.2 (silne typowanie itp.) (brak typowania nadal)
6. Używaj phpunit/phpspec - naucz się pisać testy (brak testów)
7. Używaj namespace`ów i composera (https://www.php-fig.org/psr/psr-4/) (brak namespace)
Tyle ode mnie
Dziękuje za odpowiedź, jak na pierwszy dzień z OOP to chyba nie jest tak źle Czeka mnie jeszcze dużo pracy, no cóż trzeba ćwiczyć.
class DatabaseConnection
$db_name
if($this->connect->connect_errno) throw new Exception('Połączenie z serwerem bazy danych nie powiodło się');
Dobrze by było jakbyś zaczął od napisania do chcesz osiągnąć, do czego to ma służyć, jakie są założenia.
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)