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 :

Comprendre la POO


Sujet :

Langage PHP

  1. #1
    Membre actif Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Points : 262
    Points
    262
    Par défaut Comprendre la POO
    Bonjour

    J'essaie d'apprendre correctement la POO en PHP et je galère un petit peu. C'est pour cela que j'aimerai quelques conseils !

    J'ai lu des cours et des tutoriels sur le net ainsi que sur un livre. Et avec ça j'ai écrit ceci :

    ville.class.php
    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
    33
    34
    35
    36
    37
     
    class Ville
    {
     
        public $id;
        public $nom;
        public $description;
     
        function __construct($cid = null, $cnom = null, $cdescription = null)
        {
            if (!empty($cid))
            {
                $this->id = $cid;
            }
     
            if (!empty($cnom))
            {
                $this->nom = $cnom;
            }
     
            if (!empty($cdescription))
            {
                $this->description = $cdescription;
            }
        }
     
        public function nom()
        {
            return $this->nom;
        }
     
        public function description()
        {
            return $this->description;
        }
     
    }
    villeManage.class.php (avec les autres fonctions comme la modification, la suppression 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
     
    class villeManage
    {
        protected $db;
     
        public function __construct()
        {
            $this->db = $db;
        }
     
        protected function addVille(Ville $ville)
        {
            $query = $this->db->prepare('INSERT INTO VILLE SET nom_ville = :nom, description_ville = :description');
     
            $query = bindValue(':nom', $ville->nom()); 
            $query = bindValue(':description', $ville->description());
     
            $query = execute();
        }
    }
    includes.php
    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
     
    include 'ville.class.php';
     
    $connection = mysql_connect('serveur', 'user', 'pwd') or die ("<p class='error'>Sorry, we were unable to connect to the database server.</p>");
    $database = "base";
    mysql_select_db($database, $connection) or die ("<p class='error'>Sorry, we were unable to connect to the database.</p>");
     
    function AfficheVille($cid = null, $cnom = null, $cdescription = null)
    {
        $query = mysql_query("SELECT * FROM ville ORDER BY nom_ville ASC"); 
     
        $villeArray = array();
        while ($row = mysql_fetch_assoc($query))
        {
            $listVille = new ville($row["id_ville"], $row['nom_ville'], $row['description_ville']);
            array_push($villeArray, $listVille);
        }
        return $villeArray;
    }
    Tout d'abord, j'aimerai savoir si ce que j'ai écrit est "bien". Et deuxièmement, si ça suit (ou pas du tout) un schéma MVC.

    Ensuite, quelque chose que j'ai du mal à voir, c'est : ajouter une ville -> on a addVille() comme fonction. Mais comment récupère-t-on les données que l'on aimerait bien mettre dans la base ? Via un formulaire tout "simple" sur la même page ? Avec des $_POST ?

    Si vous pouviez m'éclaircir un peu plus sur la POO en PHP, sur le découpage des pages (entre les pages d'admin et les pages pour les visiteurs), ça me serait bien utile

    Merci !

  2. #2
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonjour,

    La fonction AfficheVille devrait s'appeler RecupererVilles et devrait être inclue dans la classe villeManage (que j'aurais nommé villeProviders, ou villeFournisseur).

    Ta classe ville devrait permettre de valoriser la ville et la description après la construction de l'objet.

    Ta classe villeManage n'a aucun intérêt à être instanciable, elle devrait être statique ou exposer un singleton.

    Via un formulaire tout "simple" sur la même page ? Avec des $_POST ?
    Pas forcément sur la meme page.
    Oui il faut récupérer à un moment les valeurs saisies dans le formulaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if($_SERVER['REQUEST_METHOD'] === 'POST'){
        $ville = new Ville(null, $_POST['nom_ville'], $_POST['desription_ville']);
        /* moi j'aurais fait : 
        $ville = new Ville($_POST['nom_ville'], $_POST['desription_ville']);
        ou $ville = new Ville();
        $ville->setNom($_POST['nom_ville']);
        */
        $ville->save();

  3. #3
    Membre actif Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Points : 262
    Points
    262
    Par défaut
    Merci beaucoup pour ces précisions ThomasR !

    Ta classe villeManage n'a aucun intérêt à être instanciable, elle devrait être statique ou exposer un singleton.
    Est-ce que tu pourrais préciser ça s'il te plait ? Le singleton surtout ^^

    Pour les autres précisions, ce sont donc surtout des problèmes de noms qui ne sont pas correspondants par rapport à ce que ça fait c'est bien ça ?

    Ma page includes.php ne sert pour le moment à rien donc (comme afficheville() n'est pas à la bonne place).

    Et enfin, je suis dans un schéma MVC ?

  4. #4
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Voici ta classe créé avec un pattern singleton :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    class villeManage
    {
        protected $db;
        private static $instance;
        private function __construct()
        {
            // d'ou vient $db ???
            $this->db = $db;
        }
     
        protected function addVille(Ville $ville)
        {
            $query = $this->db->prepare('INSERT INTO VILLE SET nom_ville = :nom, description_ville = :description');
     
            $query = bindValue(':nom', $ville->nom()); 
            $query = bindValue(':description', $ville->description());
     
            $query = execute();
        }
     
        function RecupererVilles($cid = null, $cnom = null, $cdescription = null)
        {
            $query = mysql_query("SELECT * FROM ville ORDER BY nom_ville ASC"); 
     
            $villeArray = array();
            while ($row = mysql_fetch_assoc($query))
            {
                $listVille = new ville($row["id_ville"], $row['nom_ville'], $row['description_ville']);
                array_push($villeArray, $listVille);
            }
            return $villeArray;
        }
     
        public static function instance()
        {
            if(self::$instance === NULL)
                self::$instance = new villeManage();
            return self::$instance;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $villes = villeManage::instance()->RecupererVilles();
    D'où vient $db dans le constructeur ?

    MVC c'est autre chose, c'est une méthode pour structurer la relation entre l'affichage et la logique métier, ici tu ne montres rien qui soit en rapport avec MVC. Il ne suffit pas de faire de la POO
    http://tahe.developpez.com/web/php/mvc/

  5. #5
    Membre actif Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Points : 262
    Points
    262
    Par défaut
    Citation Envoyé par ThomasR Voir le message
    D'où vient $db dans le constructeur ?

    MVC c'est autre chose, c'est une méthode pour structurer la relation entre l'affichage et la logique métier, ici tu ne montres rien qui soit en rapport avec MVC. Il ne suffit pas de faire de la POO
    http://tahe.developpez.com/web/php/mvc/
    Merci ! Je vais utiliser ce code alors.
    $db est le nom de ma base qui est dans mon includes.php

    Je sais pour MVC mais c'était pour savoir si ce que je faisais avait l'air de respecter ce schéma justement. J'ai téléchargé le PDF du cours, je vais le relire

    Merci !

  6. #6
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Si tu veux faire référence à une variable déclarée globlement il faut préfixer global devant sa déclaration.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private function __construct(){
        global $db;
        $this->db = $db;
    }
    mais idéalement il aurait fallu soit exposé ta $db au travers d'une fonction, d'une méthode, ou d'un singleton, soit le passer en paramètre du constructeur

  7. #7
    Membre actif Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Points : 262
    Points
    262
    Par défaut
    D'accord ! J'ai encore pas mal de choses à apprendre
    Merci pour les conseils

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2007
    Messages : 78
    Points : 65
    Points
    65
    Par défaut
    ThomasR, dans ton pattern singleton tu as oublié de mettre la fonction instance() en static. Sans ça, tu peux pas l'appelé avec villeManage::instance()

    Le code corrigé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     public static function instance()
        {
            if(self::$instance === NULL)
                self::$instance = new villeManage();
            return self::$instance;
        }

  9. #9
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Exact, merci.

  10. #10
    Membre actif Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Points : 262
    Points
    262
    Par défaut
    De même !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.0] Mon sujet pour comprendre la POO avec PHP
    Par Le nettoyeur dans le forum Langage
    Réponses: 3
    Dernier message: 09/07/2014, 18h05
  2. Quel langage pour mieux comprendre la POO?
    Par vg-matrix dans le forum Débuter
    Réponses: 5
    Dernier message: 08/01/2010, 19h17
  3. Réponses: 5
    Dernier message: 22/01/2006, 09h10
  4. [Procédure][java] A n'y rien comprendre
    Par Stessy dans le forum SQL
    Réponses: 2
    Dernier message: 18/03/2004, 15h05
  5. lier un cube à un objet (POO)
    Par Hypnos dans le forum OpenGL
    Réponses: 12
    Dernier message: 26/08/2003, 21h46

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