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 :

[POO] Problème avec de la POO


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2007
    Messages : 267
    Points : 367
    Points
    367
    Par défaut [POO] Problème avec de la POO
    Bonjours à tous.

    Voila j'ai un souci dans une classe.

    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
     
    <?
     
    class Commande
    {
        var $nomClient;
        var $listePizzas;
     
     
        function ajouterPizza($nbpizza,$nombre)
        {
            $this->listePizzas[$nbpizza] = $nombre;
        }
     
        function afficherCommande()
        {
                 echo "Commande du client : ".$this->nomClient;
     
    	for($i=0;$i<$nbpizza;$i++)
        	{
    	echo "<BR>Pizza(s): ".$this->listePizzas[$i];
    	}
     
        }
    }
     
    ?>
    Je voudrais créer un tableau comme avec comme index
    ListePizza[0] => Campagnarde
    ListePizza[2] => Peperonni
    etc...

    Et je voudrais que dans ma boucle for il affiche :
    Commande du client : Alex //cela sa fonctionne...
    Pizza(s): Campagnarde
    Pizza(s): Peperonni
    Pizza(s): Giante

    Quelqu'un aurait une idée ?

  2. #2
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    il faut indiquer dans ta classe que la variable $listePizzas est un tableau et donc faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        var $listePizzas = array();
    il me semble aussi que var n'est plus utilisé dans PHP (est déprécié) et que tu peux t'en passer et mettre plutôt private mais ça dépend surement de la version de PHP.

    EDIT: pardon j'avais pas bien compris ton post, ton problème n'est pas spécialement au niveau du tableau mais plutot de comment faire? PArce que là ta classe n'a pas de constructeurs, tu ne mémorises pas le nom du client. Donc si tu as d'autres questions il faudra plus de précisions

  3. #3
    Membre averti
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2007
    Messages : 267
    Points : 367
    Points
    367
    Par défaut
    Donc je precise mon php fonction comme suite :
    Page 1 => Page 2

    Dans la page 1 on selection le nom du client et les pizzas commandé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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    <?
    include("connexion.inc");
     
    echo"Page de commande de la pizzeria";
     
    echo"<form method='POST' action='valider_commande.php'>";
     
    echo"Nom du client : <input type='text' name='nom' size='20'></br></br>";
    echo"Choisir les pizzas :</br>";
     
    $req="Select * from pizza order by Code_pizza";
    $rqexe=mysql_query($req) or die (mysql_error());
     
    echo"
    <table border='2' bgcolor='' width=''>
    ";
     
     
    while($Pizza=mysql_fetch_array($rqexe))
            {
    extract($Pizza);
    if($Code_pizza<>"")
     
    echo"<tr><td width=''>
    <input type='text' name='Nom_P[]' value='$Nom_pizza' Readonly></td>";
    echo"
    <td width=''>
    <input type='text' name='NbPizza[]' size='10' value=0></br>
    </td></tr>";
     
    }
    echo"</table>";
    echo"<input type='submit' value='Valider' name='bnom'>";
    echo"</form>";
     
    ?>
    Page 2 => valider_commande.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
     
    <?
    include("connexion.inc");
    include("commande.class.php");
    $nom=$_POST['nom'];
    $tabNbPizz=$_POST['NbPizza'];
    $tabPizza=$_POST['Nom_P'];
     
     
    $client = new Commande();
    $client->nomClient=$nom;
     
    $i=0;
     
    foreach($tabNbPizz as $value)
    {
      if($tabNbPizz[$i]<>0)
    	{
    	$req="Select Code_pizza from pizza where Nom_pizza='".$tabPizza[$i]."'";
    	$reqexe=mysql_query($req) or die (mysql_error());
    	$num=mysql_fetch_array($reqexe);
     
    	$client->ajouterPizza($num[0],$value);
     
    	}
    $i++;
    }
    echo"</br>";
    $client->afficherCommande();
     
    ?>
    Class : commande.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
     
    <?
     
    class Commande {
        var $nomClient;
        var $listePizzas=array();
    	var $nbP;
     
    $nbP=0;
     
     
        function ajouterPizza($nbpizza,$nombre)
    	{
            $this->listePizzas[$nbpizza] = $nombre;
            $nbP++;
        }
     
        function afficherCommande()
    	{
            echo "Commande du client : ".$this->nomClient;
     
    	  for($i=0;$i<$nbP;$i++)
        	{
    		echo "<BR>Pizza(s): ".$this->listePizzas[$i];
    		}
    		echo " Euros<BR>";
     
        }
    }
     
    ?>

  4. #4
    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
    En php4, ta classe Commande donne :
    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
    <?php
     
    class Commande {
        var $nomClient;
        var $listePizzas=array();
    	var $nbP=0;
     
        function ajouterPizza($nbpizza,$nombre)
    	{
            $this->listePizzas[$nbpizza] = $nombre;
            $this->nbP++;
        }
     
        function afficherCommande()
    	{
            echo "Commande du client : ".$this->nomClient;
     
    		for($i=0;$i<$this->nbP;$i++)
        	{
    			echo "<BR>Pizza(s): ".$this->listePizzas[$i];
    		}
    		echo " Euros<BR>";
        }
    }
     
    ?>

  5. #5
    Membre averti
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2007
    Messages : 267
    Points : 367
    Points
    367
    Par défaut
    Ok merci bon je vais voir parceque avec ton code j'ai :

    Commande du client : Alex
    Notice: Undefined offset: 0 in c:\program files\easyphp1-8\www\pizzeria\commande.class.php on line 20

    Pizza(s):
    Pizza(s): 10

    Ya du mieu c'est déjà ça merci !
    Je continu d'essayer.

    Edit : Enfaite ça marche j'avais un souci dans ma bdd c'est reglé mais j'ai toujours un souci.
    Il m'affiche :
    Commande du client : Alex
    Pizza(s): 10
    Pizza(s): 2

    Je voudrais qu'il m'affiche :
    Pizza(s): Campagnard 10
    Pizza(s): Giante 2

  6. #6
    Membre averti
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2007
    Messages : 267
    Points : 367
    Points
    367
    Par défaut
    C'est bon j'ai trouvé le moyen :

    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
     
    <?php
     
    class Commande {
        var $nomClient;
        var $listePizzas=array();
        var $tabPizzas=array();
    	var $nbP=0;
     
        function ajouterPizza($nbpizza,$nombre)
    	{
            $this->listePizzas[$nbpizza] = $nombre;
            $this->nbP++;
     
            $requete="Select Nom_pizza from pizza where Code_pizza='".$nbpizza."'";
            $reqexe=mysql_query($requete) or die (mysql_error());
            $nomPIZZA=mysql_fetch_array($reqexe);
     
            $this->tabPizzas[$nbpizza] = $nomPIZZA[0];
        }
     
        function afficherCommande()
    	{
            echo "Commande du client : ".$this->nomClient;
     
    		for($i=0;$i<$this->nbP;$i++)
        	{
        		echo"</br> Pizza : ".$this->tabPizzas[$i];
    			echo " ".$this->listePizzas[$i];
     
    		}
     
        }
    }
     
    ?>

  7. #7
    Membre averti

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 206
    Points : 319
    Points
    319
    Par défaut
    Bon déjà PHP utilise un système de gestion de variable qui lui est propre, tu n'as pas à indiquer que ca va être un tableau ou autre car il le detectera tout seul, tu peut meme créer un tableau de chiffre et la ligne d'après changer ta variable en une phrase sa lui fera ni chaud ni froid ( à PHP ), si tu utilise des classes je te conseil de prendre la version 5 de PHP car la 4 n'est pas totalement prête pour une bonne POO, et tu n'as pas non plus à spécifier le var car PHP détectera tout seul les variables à partir du moment ou il y a le $ devant le nom. Aussi il ne faut surtout pas (jamais) initialiser les attributs de la classe directement en les définissant (comme $nbP). Essaye donc ceci avec PHP 5:
    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
    <?php
    class Commande 
    {
        private $nomClient;
        private $listePizzas;
        private $nbP;
     
        public function __construct( $nomDuClient )
        {
            //On créer une commande associée à un nom donc
            $this->nomClient = $nomDuClient;
            $this->nbP = 0; //Aucune pizza commandée au début.
        }
     
        public function ajouterPizza( $nomDeLaPizza )
        {
            $this->listePizzas[$this->nbP++] = $nomDeLaPizza;
            //L'incrémentation de $nbP se fera APRES l'affectation        
        }
     
        public function afficherCommande()
        {
            echo 'Commande du client : '.$this->nomClient;
     
    	for( $i=0; $i<$this->nbP; $i++)
        	{
    			echo '<br />Pizza(s): '.$this->listePizzas[$i];
    	}
    		echo ' Euros<br />';
        }
    }
    P.S. : J'ai vu ton post au dessus que tu as mis entre temps lol ^^, tu peut faire une fonction qui récupère le nom de la pizza en fonction de son numéro et ensuite l'utiliser pour ajouter les pizzas, un peu comme sa :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public function getPizzaByID( $IDpizza )
    {
        //Récupere le nom de la pizza....
       return $nomDeLaPizza; //Tu renvoi le nom.
    }
     
    // et pour ajouter ta pizza tu pourra faire :
    $objet->ajouterPizza( $objet->getPizzaByID( $ID_DeLaPizza ) );

    Pour une bonne POO je te conseil de tout séparer et de ne jamais mettre d'echo dans les objets/classes, sa ne provoquera pas d'erreur mais il vaut mieux qu'un objet te renvoye la valeur plutot que l'afficher directement car tu pourrai avoir besoin de simplement récupérer cette valeur dans l'avenir mais ta classe va l'afficher directement et tu aura tout programmer auparavant avec l'affichage direct donc bonjour les modifs.....

  8. #8
    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
    tu n'as pas à indiquer que ca va être un tableau ou autre car il le detectera tout seul
    On appel cela de la propreté et de la rigueur...

    Aussi il ne faut surtout pas (jamais) initialiser les attributs de la classe directement en les définissant (comme $nbP).
    Je suis contre ce que tu dit. Une variable se doit d'être initialiser. Que tu le fasse dans le constructeur ou dans la définition des variables, c'est du pareil au même mais il ne faut surtout pas oublier de l'initialiser quand derriere on fait un ++ par exemple. Encore une fois, c'est une question de propreté de code, de rigueur et surtout de sécurité.

  9. #9
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Tout a fait d'accord avec Korko Fain. Le PHP n'est pas typé c'est vrai il est donc très permissif sur certaines choses et si tu ne veux pas passer des heures a débugger des choses toutes simples il vaut mieux commencer par organiser proprement le code et définir correctement tes variables. Par ailleurs si tu fais ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $maVariable;
    array_push($maVariable, 4);
    ca ne fonctionne pas vu que $maVariable n'est pas un tableau.

    Dans une classe, il est encore plus important d'organiser correctement ses variables membres et de les "typer" si possible. C'est pour une question de clarté et de gain de temps! A moins de faire des codes à utilisation unique c'est quand même indispensable...

  10. #10
    Membre averti
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2007
    Messages : 267
    Points : 367
    Points
    367
    Par défaut
    Merci pour vos réponses, je regarde cela cette apreme de nouveau.

    Je debute pour la POO donc j'avourais que certaines nuance m'échappe un peu.

    Par exemple le fait d'utiliser un constructeur
    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 employe
    {
     $Numero;
     $Nom;
     $Prenom;
     $Adresse;
     $tel;
     $nombreEnfants;
     
    	function employe($numero,$nom,$prenom,$adr,$tel,$n)
    	{
    	$this->Numero=$numero;
    	$this->Nom=$nom;
    	$this->Prenom=$prenom;
    	$this->Adresse=$adr;
    	$this->tel=$tel;
    	$this->nombreEnfants=$n;
    	}
    }
    Dans ma page principale on dire je tape :
    $Sal1 = new employe($numero,$nom,$prenom,$adresse,$tel,$nb);

    cela fonctionne. Mais d'après ce que vous ecrivez je devrais pour réafficher mes informations utiliser une methode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function afficherInformation
    {
    return $Numero;
    return $Nom;
    }
    Là je comprend pas vraiment comment il peur me recuperer les valeur de mon objet en cours... j'ai beau lire les topics et les tutos là... je voudrais bien une explication...

  11. #11
    Membre averti

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 206
    Points : 319
    Points
    319
    Par défaut
    Pour les variables il suffit de mettre Private ou Public et il faut bien sûr les initialiser mais dans le constructeur et non pas la où elles sont définies, le typage en PHP ne sert que pour ressortir les variables à l'aide de pre-cast, pas pour leur création :

    Code PHP : 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
    <?php
    //On veut définir un nombre , comme en C
    int $k; //Cela provoque une erreur car PHP gère lui même le type de la variable
    $k = '000000001'; //Un nombre dans une chaîne de caractère, c'est donc un type STRING.
    echo $k; //Affichera : 000000001
    echo (int) $k;//Affichera : 1
     
    //Sinon pour ceci :
    $maVariable;
    array_push($maVariable, 4);
    /*C'est la fonction array_push qui requiert un tableau pour fonctionner...donc
    c'est sur que si tu ne lui donne pas de tableau elle ne marchera pas..j'utilise
    rarement cette fonction mais je viens de tester et donc oui il faut une 
    variable qui soit déjà initialisée et du type Array. Exemple ^^ :*/
    $test[0][0] = array();
    $test[0][1] = 'test';
    array_push( $test[0][0], 'test2' );//Cela marche car $test[0][0] est un tableau.
    array_push( $test[0][1], 'test3' );//Erreur! $test[0][1] est un STRING.
     
    //Néanmoins, ceci :
    $_SESSION = array();
    //te garantis que ta variable sera vide, c'est souvent utilisé pour supprimer les variables de session.
    ?>

    Sinon pour Alex70, n'oublie pas de spécifier PUBLIC ou PRIVATE pour les attributs de ta classes et aussi les méthodes(fonctions), si tu es sous PHP5 renomme la fonction employe en __construct (double underscore au début, les tiret-bas ).
    Sinon oui pour récupérer les attributs de la classe il est conseillé de faire des getteur qui sont des fonctions qui servent à récupérer les attributs et les renvoyer , comme ceci :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    public function getLastName()
    {
        return $this->Nom;
    }
     
    public function getFirstName()
    {
        return $this->Prenom;
    } ?>

    Pourquoi ces fonctions pense-tu ? Car cela permet de mettre les attributs de la classe en PRIVATE et de pouvoir les récupérer quand même, ce qui te garanti que les attributs de la classe ne peuvent être modifié uniquement que par les méthodes de cette même classe et non directement comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $employe->Nom = 'MonNom'; //Erreur !! L'attribut est privé
    $employe->changeName( 'MonNom' );//Modifiera le nom.
     
    public function changeName( $newName ) //Fonction dans la classe
    {
        $this->Nom = $newName;
    }
    Si l'ont emplois ces méthodes c'est surtout pour éviter les erreurs

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

Discussions similaires

  1. [POO] Problème de langue avec la classe phpmailer
    Par sansouna24 dans le forum Langage
    Réponses: 10
    Dernier message: 05/01/2012, 16h14
  2. [POO] Conteneur d'application avec PHP
    Par BRAUKRIS dans le forum Langage
    Réponses: 5
    Dernier message: 29/09/2006, 09h23
  3. [POO] Instancier un objet avec le nom de la classe
    Par shinchun dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2006, 13h44
  4. [POO] Tri de photo avec menu deroulant
    Par gueno dans le forum Langage
    Réponses: 6
    Dernier message: 21/03/2006, 18h29
  5. [POO] Déplacer un objet avec un pas.
    Par Olaf MENJI dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 28/12/2005, 13h32

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