IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

De l'utilité des classes ?


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 117
    Points : 80
    Points
    80
    Par défaut De l'utilité des classes ?
    Bonjour,

    J'explique mon cas ... Pour gagner du temps sur le moyen / long terme, j'ai envie de mettre en place un système qui me permettrait de "rapidifier" la création de formulaire.

    Je voulais m'orienter vers la POO. Voici un cas très simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class form {
      var $name
      var $action
      var $method
     
      function openForm($name, $action, $method) {
        echo "<form name=\"$name\" method=/"$method\" action=\"$action\">";
      }
     
      function closeForm() {
        echo "</form>";
      }
    }
    Quelle est l'utilité de faire cela alors que si je me limite à créer les fonctions, j'obtiendrai le même résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function openForm($name, $action, $method) {
      echo "<form name=\"$name\" method=/"$method\" action=\"$action\">";
    }
     
    function closeForm() {
      echo "</form>";
    }
    Le but (quelle que soit la soluce choisie) étant que par la suite, je n'aurai qu'à taper le code ci-dessous pour que le système me crée un nouveau formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    openForm(nomduformulaire, envoi.php, POST);
    Et ceci pour qu'il le ferme :

    Votre avis ?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 117
    Points : 80
    Points
    80
    Par défaut
    J'ajoute que mon post précédent est un exemple simpliste de ce que je veux faire ...

    Le but final serait de pouvoir créer des formulaires complets facilement, par un tel système ...

  3. #3
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Dans ton cas très simple, aucun intérêt. Si tu ne vois pas d'intéret à utiliser une solution, pas la peine d'investir du temps dessus.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2005
    Messages : 774
    Points : 936
    Points
    936
    Par défaut
    bêh pour ce que tu veux faire, il faut dire qu'il n'y a pas de différence a utiliser les classes ou les fonctions. Sinon il faut dire que la POO offre d'enormes avantages notamment l'encapsulation, la reutilisabilité, etc ...
    Si il te faut necessaire faire un choix, je te propose les classes
    Les hommes naissent et demeurent libres et egaux en dignité et en droit. Les distinctions sociales ne peuvent etre fondées que sur l'utilité commune. Article 1 droits et de l'homme et du citoyen. 1789

  5. #5
    Membre éclairé
    Avatar de genova
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 487
    Points : 790
    Points
    790
    Par défaut
    Pour ton exemple, l'utilité serait serait que tes fonctions sont facilements reconnaissables, ainsi tu aurais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $form = new form;
    $form->open('nomduformulaire', 'envoi.php', 'POST');
    $form->close();
    En lisant ton code tu sais déjà qui sert à quoi.

    La POO te permet aussi de jouer avec des constructeurs / destructeurs (PHP5), tu aurais donc tout simplement besoin de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class form {
      function __construct($name, $action, $method) {
        echo "<form name=\"$name\" method=/"$method\" action=\"$action\">";
      }
     
      function __destruct() {
        echo "</form>";
      }
    }
    par conséquent simplement :
    $form = new Form;

    (__destruct() sera appelé à la fin de ton script. Si tu souhaites l'appeler avant, tu peux détruire l'objet simplement avec unset($form);)



    De plus admettons que demain toi ou un autre développeur souhaite ajouter des possibilité à cette classe sans chercher partout où ajouter quoi, il suffirait de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class input extends form
    {
       function text($name, $value = '', $size = 30)
       {
          echo '<input type="text" name="' . $name . '" size="' . $size . '" value="' . $value . '" />';
       }
    }
    et ainsi tu pourrais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $form = new input; // Ouverture du formulaire, avec l'appel du constructeur
    $form->input('toto');
    $form->input('titi');
    unset($form); // Fermeture du formulaire, appel du destructeur
    Testez le forum Fire Soft Board, un forum libre, gratuit et français.

    Système de template de phpBB - Lisez la FAQ PHP avant toute question si vous débuttez en PHP.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 117
    Points : 80
    Points
    80
    Par défaut
    Un grand merci pour cette grande explication ;-)

    Ma question avait bien entendu un sens "ironique", ne conaissant pas encore suffisament les classes.

    Je vois bien que ce système doit être utile mais pour reprendre ton dernier exemple, je pourrai tout aussi bien simplement créer une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function text($name, $value = '', $size = 30)
       {
          echo '<input type="text" name="' . $name . '" size="' . $size . '" value="' . $value . '" />';
       }
    et faire un appel à celle-ci via text(nomdemoninput);

    Ca donnerait tout de même le résultat voulu ... Et c'est la que je me demande si je dois me lancer dans la construction en classe ou simplement dans l'utilisation des fonctions ;-)

    Merci en tout cas pour ces éclaircissements !

  7. #7
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    non ça ne donnera pas la meme chose puisque justement, ce qu'on t'explique c'est qu'avec la classe, tu aura la balise <form> qui encadrera automatiquement ton input de pars l'heritage (le extends).

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 117
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par Korko Fain
    non ça ne donnera pas la meme chose puisque justement, ce qu'on t'explique c'est qu'avec la classe, tu aura la balise <form> qui encadrera automatiquement ton input de pars l'heritage (le extends).
    Donc ... Si je crée ma classe Form (comme indiquée dans l'autre post) de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class form {
      function __construct($name, $action, $method) {
        echo "<form name=\"$name\" method=/"$method\" action=\"$action\">";
      }
     
      function __destruct() {
        echo "</form>";
      }
    }
    et que je crée une classe input de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class input extends form
    {
       function text($name, $value = '', $size = 30)
       {
          echo '<input type="text" name="' . $name . '" size="' . $size . '" value="' . $value . '" />';
       }
    }
    je ne suis pas obligé d'instancier la class form mais je peux simplement faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $form = new input; // Ouverture du formulaire, avec l'appel du constructeur
    $form->input('toto');
    unset($form);
    Pour que mon formulaire soit créé avec </form> à la fin ?
    Ou dois-je tout de même instancier la classe form +/- de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $form = new form;
    $form->open('nomduformulaire', 'envoi.php', 'POST');
    Merci encore.

  9. #9
    Membre éclairé
    Avatar de genova
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 487
    Points : 790
    Points
    790
    Par défaut
    Effectivement tu peux utiliser des fonctions, pour ce que tu veux faire ça aurait le même effet visuel. Cependant la façon de penser est différente, en programmant en POO tu considères les éléments comme des objets. Ainsi ton formulaire est un objet, ta connexion à la base de donnée est un objet, etc ...

    Pourquoi préférer l'objet aux fonctions ? Pour ces raisons principalement :
    • La POO te permet une meilleure lisibilité du code. Ainsi tu vois facilement que $db->coucou() est une fonction qui fait quelque chose sur ta base de donnée, $template->bonjour() une fonction liée à ton template.
    • La POO te donne de nombreux outils supplémentaires, par exemple :
      • Les constructeurs / destructeurs, pour donner un exemple avec une classe de base de donnée :
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        class Database
        {
        	function __construct($server, $login, $password, $dbname)
        	{
        		// Tu fais ici ta connexion à la base de donnée
        		mysql_connect(...);
        	}
         
        	function query($sql)
        	{
        		mysql_query(...);
        	}
         
        	function __destruct()
        	{
        		mysql_close();
        	}
        }
        ce qui est plus clair et automatique.
      • La POO te permet de créer des propriétés (des variables locales à ton objet), par exemple :
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        class Database
        {
        	private $count = 0;
         
        	function __construct($server, $login, $password, $dbname)
        	{
        		// Tu fais ici ta connexion à la base de donnée
        		mysql_connect(...);
        	}
         
        	function query($sql)
        	{
        		mysql_query(...);
         
        		// on incrémente $count à chaque requète
        		$this->count++;
        	}
         
        	// Retourne le nombre de requètes executées (utile pour le debug, etc ..)
        	function total_query()
        	{
        		return ($this->count);
        	}
         
        	function __destruct()
        	{
        		mysql_close();
        	}
        }
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        $db = new Database('localhost', 'root', '', 'nomDeMaBaseDeDonnee');
        $db->query('SELECT * ...');
        $db->query('INSERT etc ...');
        echo 'Nombre total de requêtes : ' . $db->total_query();
      • La POO te permet d'étendre tes classes (par exemple tu fais une classe Livre pour un gestionnaire de bibliothèque, si tu souhaites définir des méthodes (fonctions) uniquement pour les manga tu pourras faire
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        8
        9
        class Livre
        {
           // Plein de fonctions liées aux livres
        }
         
        class Manga extends
        {
        	// Cette classe contient les méthodes (fonctions) de la classe Livre, ainsi que les nouvelles méthodes ajoutées
        }
        avec tout ce qu'implique l'héritage : la surcharge de fonction (le fait que si tu créé une fonction ayant le même nom dans Livre et Manga, la fonction de Manga écrasera celle de Livre - très pratique), surcharge de propriétés, etc etc ..


    Au début tu auras du mal a voir l'intérêt de la POO (pour avoir eu le même raisonnement que toi au début - a savoir "mais à quoi sert la POO alors que je peux le faire avec des fonctions ?" - je peux te garantir que pour peu que tu t'intéresse un minimum à la POO tu vas pas tarder à être converti et à tout faire en POO



    Pour répondre à ta question sur le formulaire, ce qui se trouve dans la fonction [b]__construct()[b] est appelé automatiquement lors de l'instance de l'objet ($form = new Form('paramètres').
    Testez le forum Fire Soft Board, un forum libre, gratuit et français.

    Système de template de phpBB - Lisez la FAQ PHP avant toute question si vous débuttez en PHP.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 117
    Points : 80
    Points
    80
    Par défaut
    Encore un super gd merci ;-)

    Je crois que je vais m'y mettre et essayer de découvrir un max. sur la POO car j'avoue que j'avais laissé cela très loin derrière moi :-)

  11. #11
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    Ta classe input héritant de la classe form, lorsque tu appel la classe input (son constructeur), automatiquement, tu appel le constructeur de la classe parent. De meme pour le destructeur. Mais le constructeur parent nécéssitant des paramètres, je te conseil de l'appeler explicitement dans la classe fille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?php
     
    class Form
    {
    	public function __construct($name, $action, $method)
    	{
    		echo "<form name=\"$name\" method=\"$method\" action=\"$action\">";
    	}
     
    	public function __destruct()
    	{
    		echo "</form>";
    	}
    }
     
    class Input extends Form
    {
    	public function __construct($name, $action, $method)
    	{
    		parent::__construct($name, $action, $method);
    	}
     
    	function text($name, $value = '', $size = 30)
    	{
    		echo '<input type="text" name="' . $name . '" size="' . $size . '" value="' . $value . '" />';
    	}
    }
     
    $form = new Input('form1', '#', 'GET');
    $form->text('toto');
     
    ?>
    Retour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <form name="form1" method="GET" action="#">
    <input type="text" name="toto" size="30" value="" />
    </form>

  12. #12
    Membre averti Avatar de Asmodean
    Profil pro
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Points : 378
    Points
    378
    Par défaut
    J'ai une petite question...

    Je vous vois parler de méthodes __construct() , mais pourquoi vous n'utilisez pas la forme classique qui est d'appelé le constructeur par le nom de la class?

    genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Form{
     
    	function Form()
    	{
    	}
     
    }
    Such is the situation in our Fallen Galaxy

  13. #13
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    Car appeler le constructeur du nom de la classe est, comme le fait de faire précéder les variables de la classe par le mot "var", la syntaxe de classes de PHP4.

    PHP5 à changer cela en créant les méthodes magiques __construct, __destruct et j'en passe. Et en remplace "var" par des mots précisant les droits de la variable (public, private, protected)

  14. #14
    Membre averti Avatar de Asmodean
    Profil pro
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Points : 378
    Points
    378
    Par défaut
    Citation Envoyé par Korko Fain
    Car appeler le constructeur du nom de la classe est, comme le fait de faire précéder les variables de la classe par le mot "var", la syntaxe de classes de PHP4.

    PHP5 à changer cela en créant les méthodes magiques __construct, __destruct et j'en passe. Et en remplace "var" par des mots précisant les droits de la variable (public, private, protected)
    C'est pas tant a php4 que je me refèrais mais à tous les autres langages de programmation. Mais c'est toujours bon à savoir. Merci de l'info.
    Such is the situation in our Fallen Galaxy

  15. #15
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    Toutes les fonctions commençant par __ sont ce qu'on appel des méthodes magiques (tu n'a pas a les appeler explicitement) :
    __construct
    __destruct
    __get
    __set
    __unset
    __call
    __toString

    renseigne toi elles sont intéréssantes

  16. #16
    Membre confirmé Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Points : 514
    Points
    514
    Par défaut
    Je vous vois parler de méthodes __construct() , mais pourquoi vous n'utilisez pas la forme classique qui est d'appelé le constructeur par le nom de la class?
    La nouvelle dénomination "__construct" a été introduite dans php5 car les destructeurs ont fait leur arrivé. Comme ces derniers ne pouvaient pas être nommés "~Name" (comme en c++ par exemple), ils ont choisi "__destruct". D'où l'arrivée de "__construct" par souci de cohérence.

    Il vaut mieux privilégier __construct, comme on peut le voir dans cet exemple, qui mélange l'ancienne et la nouvelle dénomination:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    class A {
      function A() { echo __METHOD__; }
    }
     
    class B {
      function __construct() { echo __METHOD__; }
    }
     
    class C extends A {
      function __construct() {
        parent::__construct(); // affiche A::A()
      }
    }
     
    class D extends B {
      function __construct() {
        parent::B(); // Fatal error: Call to undefined method B::b()
      }
    }
     
    $c = new C;
    $d = new D;

  17. #17
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par goodpz
    Comme ces derniers ne pouvaient pas être nommés "~Name"
    Pourquoi ?

  18. #18
    Membre confirmé Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Points : 514
    Points
    514
    Par défaut
    Pourquoi ?
    Pour ne pas devoir ajouter un nouveau symbole à la grammaire de php et qui casse en plus la règle [_a-zA-Z] pour le début des noms des fonctions

Discussions similaires

  1. Utilité des classes abstraites en java 8
    Par Anubis dans le forum Général Java
    Réponses: 3
    Dernier message: 10/10/2014, 09h27
  2. Utilité des classes DAO générées avec Hibernate Tools
    Par marooned dans le forum Hibernate
    Réponses: 12
    Dernier message: 13/01/2013, 20h17
  3. utilité des classes, différence entre classe et fonction
    Par Papyllon dans le forum Général Python
    Réponses: 45
    Dernier message: 30/09/2010, 10h27
  4. L'utilité des classes statiques
    Par Blowdi dans le forum Débuter
    Réponses: 6
    Dernier message: 08/06/2009, 12h13
  5. [POO] [AVIS] L'utilité des classes
    Par Anduriel dans le forum Langage
    Réponses: 66
    Dernier message: 10/11/2005, 16h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo