php
  • oop
  • 2009-10-23 4 views 6 likes 
    6

    Pour la lecture et les essais de longue durée, mais je veux savoir. C'est correct code PHP OOP, ou pasCeci est OOP ou comme OOP

    Class User { 
    
        function Add($Name, $Password){ 
        $sql_str = "INSERT INTO User SET Name = '$Name', Password = '$Password'"; 
        $sql->do_sql($sql_str); 
        } 
    
        function Del($UserID) { 
        $sql_str = "DELETE FROM User WHERE UserID = '$UserID'"; 
        $sql->do_sql($sql_str); 
        } 
    
        function Show ($Limit) 
        if ($limit > 0){ 
         $sql_str = "SELECT * FROM User ORDER BY Name LIMIT $Limit"; 
        }else{ 
         $sql_str = "SELECT * FROM User ORDER BY Name"; 
        } 
        $result = $sql->do_sql($sql_str); 
        for ($i = 0; $i < COUNT($result); $i++){ 
         $data[$i]['UserID'] = .... 
         $data[$i]['Name'] = .... 
        } 
        return $Data 
        } 
    
    } 
    $MyUser = new User; 
    

    Et maintenant à partir du fichier userControl.php je peux contrôler les actions. Si je veux faire quelque chose, je peux envoyer l'action à l'instance de la classe d'utilisateurs: $MyUser->Add($Name, $Password); Cette approche ressemble-t-elle plus à une fonction groupée et non à la POO ou est-elle préférable d'utiliser des setters et des getters?

    Si cet exemple n'est pas OOP, alors qu'est-ce que je fais de mal et comment faut-il faire cet exemple de manière OOP?

    Tnx

    +0

    Je ne pense pas qu'il vaut la peine d'en bas-voix. C'est une question bien formulée et montre un peu de code. Je pense que ça vaut le +1, même si ce n'est pas "beau" ou "correct". – PatrikAkerstrand

    +0

    Je pense que si vous appelez la classe UserAccount, vous êtes plutôt bon. – DanMan

    Répondre

    0

    Techniquement, il est, mais vous êtes soit manquant beaucoup de code ou vos méthodes ne fonctionnera pas. Vous ne semblez pas définir $ sql n'importe où. Puisque la beauté d'Oop brille vraiment quand vous éliminez le code en double, et que vous utilisez $ sql dans toutes vos méthodes, il serait bon de voir comment vous avez géré cela. Sans code complet, il est difficile de donner des suggestions.

    Voici un bref exemple de ce que je veux dire. Puisque vous n'utilisez toutes les fonctionnalités oop de PHP5 Je vais rester avec PHP4:

    class User 
    { 
        var $sql; 
        function User() 
        { 
        $this->sql = new DatabaseConnection(); 
        } 
    
        function add($data) 
        { 
        $query = '...query here...'; 
        $this->sql->query($query); 
        } 
    } 
    

    Si vous voulez vérifier quelques exemples de solides, le code niveau de l'entreprise, je recommande fortement la recherche à certains des composants dans Zend Framework.

    6

    Vous n'allez pas dans ce sens. Ce que vous voulez vraiment faire est d'avoir un utilisateur de classe qui représente un seul utilisateur, avec des méthodes reflétant cela.

    De wikipedia:

    Dans la programmation orientée objet, un procédé est un sous-programme qui est exclusivement associé soit à une classe (auquel cas il est appelé une méthode de classe ou une méthode statique) ou avec un objet (auquel cas il s'agit d'une méthode d'instance ).

    Un objet utilisateur doit au moins avoir des méthodes d'instance permettant de:

    • charge à partir de la base de données
    • Enregistrer dans la base de données

    Et une méthode statique: - Créer un utilisateur et retourner un objet utilisateur.

    Il devrait aussi avoir une méthode constructeur (__construct (args) en PHP5 ou User (args) en PHP4) à appeler lors de la création de l'utilisateur. Cela devrait probablement accepter un identifiant ou un nom d'utilisateur ou quelque chose d'identifiant afin qu'il puisse charger le bon utilisateur. Par souci de simplicité et pour ne pas tout faire pour vous, imaginez un objet utilisateur avec juste un identifiant et un nom.Voici comment la classe pourrait ressembler:

    En supposant PHP5:

    class User{ 
        private $id; 
        public $name; 
    
        public function __construct($id){ 
         $this->load($id); 
        } 
    
        public function load($id){ 
         // Do a query to load a user and initialize $id and $name. 
        } 
    
        public function save(){ 
         // Do a query saving $this->id and $this->name to the database. 
        } 
    
        public static function create($name){ 
         // Do a query to create a user with name $name. 
        } 
    } 
    

    Vous pouvez charger un utilisateur donné son id en utilisant new User($id), ou créer une donnée User::create($name)

    Au risque d'être au sens figuré crucifié, je wouldn Ne vous embêtez pas avec les setters et getters en PHP.

    +1

    Avant de commencer ... _Je ne voudrais pas déranger avec les setters et getters en PHP_ en général? Ou juste pour cet exemple particulier? :) – dbf

    2

    $MyUser->Add($Name, $Password); semble étrange. Essayez quelque chose comme ceci:

    class UserManager { 
        public function add(User $user) { 
         $sql->do_sql("INSERT INTO users (id, name) VALUES (".$user->getId().", ".$user->getName().")"); 
        } 
        public function delete(User $user) { 
         $sql->do_sql("DELETE FROM users WHERE id = ".$user->getId()." LIMIT 1"); 
        } 
        public function show(User $user) { 
         return $sql->do_sql("SELECT * FROM users WHERE id = ".$user->getId()); 
        } 
    } 
    

    et

    class User { 
        private $_id; 
        private $_name; 
        public function getId(){ 
         return $this->_id; 
        } 
        public function getName(){ 
         return $this->_name; 
        } 
    } 
    

    Un modèle de conception qui pourrait adapter est Active Record.

    +0

    Je suis une de ces fous qui pensent que les méthodes getter et setter sont malodorantes, mais YMMV. Je dois même admettre que je les utilise parfois, mais au moins je me sens mal à ce sujet. ;) – DanMan

    0

    Merci! Je sais que quelque chose à propos de la POO n'est pas correct, il faut que je bouge. Pourquoi je fais des choses comme moi. D'abord j'utilise le moteur de template. Après la publication des données de l'utilisateur, ce fichier d'action affiche des données. Il existe quelque chose de cette actionUser.php:

    $op = ''; 
    IF (ISSET($_REQUEST['op'])){ 
        $op = ADDSLASHES($_REQUEST['op']); 
    } 
    
    if ($op == 'AddUser'){ 
    $Name = ADDSLASHES($_REQUEST['Name']) 
    $Password = ADDSLASHES($_REQUEST['Password']) 
    $MyUser->Add($Name, $Password) 
    } 
    

    Ensuite, envoyez une action à l'utilisateur de la classe.

    utilisateur classe ont peu Litle plus fonction de

    class User{ 
    private $SQL; 
    
        public function __construct(){ 
         $this->SQL = SQL::getInstance(); 
        } 
    
        public Function AddUser ($Name, $Password) { 
        $sql_str ="INSERT INTO USER SET Name = '$Name', Password='$Password'"; 
        $this->SQL->do_sql($sql_str); 
        } 
    
        public Function DelUser($UserID){ 
         $sql_str = "DELETE FROM User WHERE UserID = '$UserID'"; 
         $sql->do_sql($sql_str); 
    
        } 
    
        public Function Login($Login, $Password){ 
         $sql_str = "SELECT * FROM User WHERE Login = '$Login' AND Password = '$Password' "; 
         LIST($sql_result, $sql_count) = $this->SQL->do_sql($sql_str); 
         if ($sql_count == 1){ 
          $_SESSION["UserID"] = $this->SQL->result_strip($sql_result, 0, "AdminUserID"); 
          $_SESSION["Login"] = $this->SQL->result_strip($sql_result, 0, "Login"); 
          $sql_str = "UPDATE User SET LastLogin = NOW()"; 
          $this->SQL->do_sql($sql_str); 
    
         } 
        } 
    
        public Function Logout(){ 
         $_SESSION = array(); 
         if (isset($_COOKIE[session_name()])) { 
          setcookie(session_name(), '', time()-42000, '/'); 
         } 
         session_destroy(); 
    
        } 
    } 
    
    Questions connexes