Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przekazywanie obiektu
Forum PHP.pl > Forum > PHP > Object-oriented programming
marcinpruciak
Piszę sobie klasę rejestracji użytkownika. Natrafiłem na problem gdy chciałem przekazać obiekt klasy bazy danych do klasy rejestracji:

Kod:

DataBaseClass.php
  1. <?php
  2. class DataBase {
  3.     private $host;
  4.     private $user;
  5.     private $password;
  6.     private $database;
  7.     public $connection;
  8.  
  9.     public function __construct($host, $user, $password)
  10.     {
  11.         $this->host = $host;
  12.         $this->user = $user;
  13.         $this->password = $password;
  14.     }
  15.  
  16.     public function select_db($database)
  17.     {
  18.         $this->database = $database;
  19.     }
  20.  
  21.     public function connect()
  22.     {
  23.         $this->connection = mysql_connect($this->host, $this->user, $this->password, $this->database);
  24.     }
  25.  
  26.     public function query($query)
  27.     {
  28.         $this->query = mysql_query($query);
  29.     }
  30.  
  31.     public function __destruct()
  32.     {
  33.         mysql_close($this->connection);
  34.     }
  35. }
  36. ?>



RegistrationClass.php
  1. <?php
  2. class Registration {
  3.     public $connection;
  4.     public $errors;
  5.     public $User;
  6.  
  7.     public function __construct($User)
  8.     {
  9.         $this->User = $User;
  10.     }
  11.     public function set_connection($database)
  12.     {
  13.         $this->connection = $database;
  14.     }
  15.  
  16.     public function check_user_register()
  17.     {
  18.         $query = $this->connection->query("SELECT name FROM users WHERE name = ".$this->User->login);
  19.         $name = mysql_fetch_array($query);
  20.         if($name[0] == $this->User->login){
  21.             $this->errors[] = "Taki użytkownik już jest zarejestrowany";
  22.             return false;
  23.         }
  24.     }
  25.  
  26.     public function register_user()
  27.     {
  28.         if($this->connection->$query = "INSERT INTO users (name, password) VALUES(".$this->User->login.", ".$this->User->password.")"){
  29.             return true;
  30.         }else{
  31.             $this->errors[] = "Rejestracja nie powiodła się";
  32.             return false;
  33.         }
  34.     }
  35. }
  36. ?>



UserClass.php
  1. <?php
  2. class User {
  3.     public $login;
  4.     public $password;
  5.     public $password2;
  6.  
  7.     public function __construct($login, $password, $password2)
  8.     {
  9.         $this->login = $login;
  10.         $this->password = $password;
  11.         $this->password2 = $password2;
  12.     }
  13. }
  14. ?>



Używanie:
  1. <form action="Form.php" method="post">
  2.     Login:<input type="text" name="login" /><br>
  3.     Hasło:<input type="password" name="pass1" /><br>
  4.     Potwierdź hasło: <input type="password" name="pass2" /><br>
  5.     <input type="submit" name="submit" value="Wyślij">
  6. </form>
  7.  
  8. <?php
  9.  
  10. if($_POST['submit'] == 'Wyślij'){
  11.     include("./DataBaseClass.php");
  12.     include("./ValidationClass.php");
  13.     include("./UserClass.php");
  14.     include("./RegistrationClass.php");
  15.  
  16.     if($_POST['login'] && $_POST['pass1']==$_POST['pass2']){
  17.         $Database = new DataBase('localhost', 'root', 'pass');
  18.         $Database->select_db('users');
  19.         $Database->connect();
  20.  
  21.         $User = new User($_POST['login'], $_POST['pass'], $_POST['pass2']);
  22.         
  23.         $Registration = new Registration($User);
  24.         $Registration->set_connection($Database);
  25.         if($Registration->check_user_register()){
  26.             $Registration->register_user();
  27.         }
  28.     }else{
  29.          echo 'error';
  30.     }
  31.         
  32. }
  33. ?>





Jestem nowy w OOP i pewnie to jest prosty problem, ale nie wiem jak sobie z nim poradzić. Przy okazji chciałbym się zapytać czy dobrze myślę i czy idę w dobrą stronę OOP.
wookieb
Jako ze chodzi o bazę danych to najlepiej do tego celu wykorzystać "singleton". Informacji na jego temat znajdziesz mnóstwo.
marcinpruciak
Poradziłem sobie. Mam singletona. Działa. Dzięki. smile.gif

Ale ponawiam drugie pytanie. Czy idę w dobrą stronę? Zamierzam dopisać do tego jeszcze klasę walidatującą i dodać kilka pól.
-=Peter=-
Myślę, że idziesz w dobrą stronę. Kilka uwag:

- jak już utworzyłeś klasę User, to swój system przebuduj tak aby odwołując się do tej klasy można by było czytać/pisać zmienne sesyjne. Czyli albo User sam zapisuje/odczytuje dane sesji, albo używa do tego osobnego obiektu (imo lepsze rozwiązanie). Bo teraz de facto ta klasa praktycznie jest tylko opakowaniem dla trzech zmiennych. Chyba że klasa User ma w Twoim przypadku pełnić rolę modelu, jeśli tak to taka funkcjonalność czytania/pisania danych do sesji w takiej klasie nie powinno się znaleźć (patrz punkt niżej).

- Klasę Registration powinieneś wg mnie przerobić na taką, która zarządza użytkownikami. Coś na wzór wzorca DAO, gdzie Registration (zmienić nazwę np. na UserManager) będzie operować na bazie danych (dodawać/usuwać/pobierać użytkowników). Wtedy klasa UserManager mogła by wpisać rekord do bazy danych, np. poprzez UserManager::insert($oUser) (w taki sposób "rejestrować" użytkowników) gdzie $oUser jest obiektem, który ma być wpisany do bazy danych (może to być np. obiekt Twojej klasy User, jeśli ta klasa nie ma pełnić rolę sesyjną, a rolę modelu).

- wymuszaj (gdzie to tylko możliwe) typy parametrów, czyli przykładowo metoda w Registration set_connection($db) powinna wyglądać set_connection(DataBase $db). Php to niestety pod względem wymuszania typów ułomny język, więc tym bardziej powinno się korzystać z tej biednej kontroli typów jaką daje nam php smile.gif

- nie używaj (wogóle, nie ma wyjątków smile.gif) publicznych pól składowych - twórz metody dostępowe
marcinpruciak
Nierozumiem o co ci chodzi z tymi zmiennymi sesyjnymi i co to wogóle jest.

Klasa zarządzająca nie jest złym pomysłem, może to dopiszę kiedyś, narazie chcę zrobić dobrą rejestrację.
-=Peter=-
A wiesz co to tablica globalna $_SESSION? Przykładowo wywołujesz:
  1. <?php
  2. $user->setId($id);
  3. $user->setEmail($email);
  4.  
  5. $user->getId();
  6. ?>

I ten kod zapisuje dane do sesji - o to mi chodziło gdy pisałem aby klasa User mogła czytać/pisać dane do sesji.

Może namieszałem ci trochę w głowie tymi wypocinami, zwłaszcza że najprawdopodobniej źle zidentyfikowałem do czego ma służyć twoja klasa User - bo zapewne ma być ona reprezentacją danych które mają być wpisane do bazy danych (rejestracja) oraz danych które mogą być wyciągnięte z tejże bazy danych. Więc dobrym pomysłem było by utworzenie klasy UserManager dla klasy User.

  1. <?php
  2. class UserManager{
  3.  /** zwraca 1 obiekt User **/
  4.  public static function getById($id){}
  5.  /** zwraca tablicę obiektów User **/
  6.  public static function getCollectionByIds(array $ids){}
  7.  /** zapisuje obiekt User do bd **/
  8.  public static function save(User $user){}
  9.  //pozostałe metody np. remove, getAll itp.
  10. }
  11.  
  12. //przykładowo rejestracja wyglądała by tak
  13. $user = new User();
  14. $user->setLogin($login);
  15. //ustawienie pozostałych wartości...
  16.  
  17. UserManager::save($user);
  18. //lub
  19. $user->save();
  20. ?>
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.