2010-12-11 27 views
0

J'ai cherché une approche d'un système utilisateur orienté objet mais je n'ai pas trouvé de tutoriel répondant à mes questions. Je ne me soucie vraiment pas du code, je peux le faire plus tard, mais la logique de la POO me tue vraiment (oh, je suis nouveau à la POO, j'ai oublié de le mentionner).OOP user system logic

Si j'ai un db mysql avec les utilisateurs, et un fichier php avec deux classes, un dbmanager et une classe d'utilisateur, est autorisé à utiliser les méthodes de dbmanager dans la classe d'utilisateur?

Sinon, comment faire pour que la classe utilisateur et la classe db interagissent les unes avec les autres?

Merci

--- EDIT ---

Est-ce que cette approche raison? Quels sont les avantages de l'utilisation, par exemple, des classes étendues?

class db{ 
    function checkUser($login, $password){ 
     $password = sha1(md5($password)); //encrypt password 
     $query = "SELECT * FROM users WHERE (login='$login' OR email='$login')"; 
     $result = mysql_query($query); 

     if ($user = mysql_fetch_assoc($result)) { 
      if ($user["password"] == $password) { 
       //there's a user class somwhere else 
       $checkeduser = new user($user); 
       return $checkeduser; 
      } else return true; //bad password 
     } else return false; //user not registered 
    } 

    $user = $dbconnection->checkUser($login, $password); //encrypted password 
    if(is_object($user)) { //if logs in 
    $_SESSION["user"] = serialize($user); 
     header("Location:index.php"); //go to home 
    } 

Répondre

0

Il n'y a absolument rien de mal à utiliser des instances d'une classe dans une autre classe. C'est ce qu'on appelle la composition.

Une autre approche est l'héritage où les sous-classes héritent des méthodes et des propriétés des classes parentes et développent la fonctionnalité de classe parente.

Ce que cela signifie dans la pratique:

  • Si vous avez une classe d'utilisateurs qui a une instance de classe de base de données comme l'un de ses membres/propriétés, vous pouvez appeler toutes les méthodes publiques de la classe de base de données sur le membre qui contient une instance de la classe.

  • Si vous avez une classe d'utilisateurs qui étend une classe de base de données, vous devriez être en mesure d'utiliser (certaines des) méthodes de classe parent (base de données).

+0

Merci code_burgar. Hier, j'ai fait une approche différente par moi-même, pouvez-vous me dire si c'est juste ou les avantages d'utiliser des cours prolongés? (regardez l'édition) –

0

Un des modèles est que vous auriez une classe générique qui traduit entre la base de données et les objets, par ex. par lecture d'une ligne de la base de données et de l'assigner à propriétés de l'objet, comme ceci:

abstract class DBTable { 
     function __construct(DBDriver $db) { 
     $this->db = $db; 
     } 
     function loadData($id) { 
      $row = $this->db->query("SELECT * FROM {$this->table_name} WHERE id=?", $id); 
      foreach($row as $key => $value) { 
       $this->$key = $value; 
      } 
     } 
    } 

    class User extends DBTable { 
     public $table_name = "users"; 
    } 

    $db = new MySQLDBDriver(); 
    $user = new User($db); 
    $user->load("joe"); 

Le traitement réel de DB est en DBManager, la relation entre les objets et DB dans DBTable. Vous pouvez regarder Zend Framework comme exemple de ce modèle: http://framework.zend.com/manual/en/zend.db.table.html

+0

Merci StasM, ça aide beaucoup. Hier, j'ai fait une approche différente par moi-même, pouvez-vous me dire si c'est juste? (regardez l'édition) –