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] Pb objet PHP5


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 120
    Points : 48
    Points
    48
    Par défaut [POO] Pb objet PHP5
    Bonjour,
    j'ai une classe candidat et une classe dossier. Un candidat peut avoir plusieurs dossiers. J'ai donc crée un tableau de dossier dans la classe candidat
    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 candidat extends connexion
    {
    	private $nom_candidat;
    	private $prenom_candidat;
    	private $mesDossiers = array();
    	private $nbDossiers;
     
    	public function __construct($login, $mdp, $role, $site, $code_connexion, $nom_candidat, $prenom_candidat)
    	{
    		connexion::__construct($login, $mdp, $role, $site, $code_connexion);
    		$this->nom_candidat = $nom_candidat;
    		$this->prenom_candidat = $prenom_candidat;
    		$this->nbDossiers = 0;
    	}
     
    	// Renvoi le nombre de dossiers par candidat
    	public function getNbDossiers($codeConnexion)
    	{
    		$query = mysql_query("select count(*) from connexion, candidat, dossier where connexion.code_connexion = candidat.code_connexion and candidat.code_connexion = dossier.code_connexion and candidat.code_connexion=".$codeConnexion);
    		$nb_dossiers = mysql_fetch_array($query);
    		$NbrDossier = $nb_dossiers[0];
    		return $NbrDossier;
    	}
     
    	//retourne le dossier
    	public function getDossier($indice)
    	{
    		return $this->mesDossiers[$indice];
    	}
     
    	public function setDossier($monDossier)
    	{
    		$this->mesDossiers[$nbDossiers + 1] = $monDossier;
    		$this->nbDossiers++;
    	}
    }
    et la classe dossier
    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
     
    class dossier
    {
    	private $codeDossier;
    	private $dateCreation;
    	private $dateDerniereModif;
     
    	public function __construct($codeDossier, $dateCreation, $dateDerniereModif)
    	{
    		$this->codeDossier = $codeDossier;
    		$this->dateCreation = $dateCreation;
    		$this->dateDerniereModif = $dateDerniereModif;
    	}
     
    	public function getCodeDossier()
    	{
    		return $this->codeDossier;
    	}
     
    	public function getDateCreation()
    	{
    		return $this->dateCreation;
    	}
    }
    Voici comment je construis un exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $candidat = new candidat(test, test, Candidat, Paris, 1, Dupont, Martin);
    $dossier = new dossier(1, 21-12-2006, NULL);
    $candidat->setDossier($dossier);
    $candidat->getDossier(0)->getCodeDossier();
    la derniere ligne plante...

    Si vous trouvez pourquoi?

  2. #2
    Membre émérite
    Avatar de Nesmontou
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Septembre 2004
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 612
    Points : 2 969
    Points
    2 969
    Par défaut
    Salut, que veux-tu dire par la derniere ligne plante... Quel est le message d'erreur ?

    Sinon, je crois voir ce qui peut clocher. Décompose ta séquence, tu vas voir :
    - $candidat = new candidat(test, test, Candidat, Paris, 1, Dupont, Martin);
    -- Tu passes dans le constructeur de ta classe : $this->nom_candidat = 'Dupont', $this->prenom_candidat = 'Martin', $this->nbDossiers = 0

    - $dossier = new dossier(1, 21-12-2006, NULL);
    -- Tu crées ton dossier

    - $candidat->setDossier($dossier);
    -- $this->mesDossiers[1] = $dossier; $this->nbDossiers = 1;

    Donc quand tu veux veux récupérer le dossier qui a pour indice 0, c'est normal qu'il y ait un problème vu qu'il n'existe pas, il a pour indice 1 en réalité.

    Dons ta fonction setDossier, écris plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->mesDossiers[$nbDossiers] = $monDossier;
    Petite remarque : tu n'es pas obligé de stocker le nombre de dossier dans ton oblet ; tu peux faire quelque chose du style :
    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
    class candidat extends connexion
    {
    	private $nom_candidat;
    	private $prenom_candidat;
    	private $mesDossiers = array();
     
    	public function __construct($login, $mdp, $role, $site, $code_connexion, $nom_candidat, $prenom_candidat)
    	{
    		connexion::__construct($login, $mdp, $role, $site, $code_connexion);
    		$this->nom_candidat = $nom_candidat;
    		$this->prenom_candidat = $prenom_candidat;
    	}
     
    	// Renvoi le nombre de dossiers par candidat
    	public function getNbDossiers($codeConnexion)
    	{
    		$query = mysql_query("select count(*) from connexion, candidat, dossier where connexion.code_connexion = candidat.code_connexion and candidat.code_connexion = dossier.code_connexion and candidat.code_connexion=".$codeConnexion);
    		$nb_dossiers = mysql_fetch_array($query);
    		$NbrDossier = $nb_dossiers[0];
    		return $NbrDossier;
    	}
     
    	//retourne le dossier
    	public function getDossier($indice)
    	{
                    // Vérifie que ce que tu veux retourner existe
                    if(isset($this->mesDossiers[$indice])) {
    		     return $this->mesDossiers[$indice];
                    } else {
                         return NULL; // NULL ou FALSE... ce que tu veux
                    }
    	}
     
    	public function setDossier($monDossier)
    	{
    		$this->mesDossiers[] = $monDossier; // Ajoute automatiquement ton dossier à la fin de ton tableau
    	}
    }
    Enfin, c'est juste une proposition

    Bon développement

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 120
    Points : 48
    Points
    48
    Par défaut
    Merci pour tes réponses. Voilà ce que j'ai modifié
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    class candidat extends connexion
    {
    	private $nom_candidat;
    	private $prenom_candidat;
    	private $dateNaissance;
    	private $pays;
    	private $mesDossiers = array();
    	private $nbDossiers;
     
    	public function __construct($login, $mdp, $role, $site, $code_connexion, $nom_candidat, $prenom_candidat, $dateNaissance, $pays)
    	{
    		connexion::__construct($login, $mdp, $role, $site, $code_connexion);
    		$this->nom_candidat = $nom_candidat;
    		$this->prenom_candidat = $prenom_candidat;
    		$this->dateNaissance = $dateNaissance;
    		$this->pays = $pays;
    		//$this->nbDossiers = 0;
    	}
     
    	public function getNbdossier()
    	{
    		return $this->nbDossiers;
    	}
     
    	// Renvoi le nombre de dossiers par candidat
    	public function getNbDossiers($codeConnexion)
    	{
    		$query = mysql_query("select count(*) from connexion, candidat, dossier where connexion.code_connexion = candidat.code_connexion and candidat.code_connexion = dossier.code_connexion and candidat.code_connexion=".$codeConnexion);
    		$nb_dossiers = mysql_fetch_array($query);
    		$NbrDossier = $nb_dossiers[0];
    		return $NbrDossier;
    	}
     
    	//retourne le dossier
    	public function getDossier($indice)
    	{
    		// Vérifie que ce que tu veux retourner existe
            if(isset($this->mesDossiers[$indice])) 
    		{
    		    return $this->mesDossiers[$indice];
            } else 
    		{
    			echo "pas dossier";
                return NULL; 
            }
     
    		return $this->mesDossiers[$indice];
    	}
     
    	public function setDossier($monDossier)
    	{
    		/* $this->mesDossiers[$nbDossiers + 1] = $monDossier;
    		$this->nbDossiers++; */
    		$this->mesDossiers[$nbDossiers] = $monDossier;
    		$this->nbDossiers++;
    	}
    }
    Dans mon programme principal:
    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
     
    for ($i=0; $i<$candidat->getNbdossier(); $i++)
    	{
    	    echo    "<td>";
    	    echo        "<a href=voirDossier.php?codeDossier=".$infoDossier[32]."></a>";
    	    echo    "</td>";
    	    echo    "<td>";
    	    echo        $candidat->getNom();
    	    echo    "</td>";
    		echo    "<td>";
    	    echo        $candidat->getPrenom();
    	    echo    "</td>";
    		echo    "<td>";
    		echo        $candidat->getDossier($i);->getCodeDossier();					
    	    echo    "</td>";
    		echo    "<td>";
    		echo        $candidat->getDossier($i);->getDateCreation();			
    	    echo    "</td>";
    		echo    "<td>";
    	    echo        $candidat->getSite();
    	    echo    "</td>";
    	    echo "</tr>"; 
    	}
    cette ligne plante. en fait, je ne construit pas mes dossiers dans le tableau je crois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $candidat->getDossier($i);->getCodeDossier();

  4. #4
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Si je puis me permettre, comme tu est en php5 pourquoi ne pas utiliser une classe héritant de ArrayObject ?

    Autrement, il est plus propre d'écrire les valeurs par défaut dans le constructeur. L'assignation des $mesDossiers comme tu le fais est plutot réservé au variables static.
    Les valeurs des variables static font partie de la définition d'une classe, et non d'un objet.

    Pour $nbDossiers, tu n'en as pas besoin dans l'absolu. Le mieu serait de le simuler via la méthode magique __get.

    En bref, voila les quelques corrections que je te suggères :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    class candidat extends connexion
    {
    	private $nom_candidat;
    	private $prenom_candidat;
    	private $dateNaissance;
    	private $pays;
    	private $mesDossiers;
    	private $nbDossiers;
    	
    	public function __construct($login, $mdp, 
    								$role, $site, 
    								$code_connexion, $nom_candidat, 
    								$prenom_candidat, $dateNaissance, 
    								$pays)
    	{
    		parent::__construct($login, $mdp, $role, $site, $code_connexion);
    		
    		$this->nom_candidat 		= $nom_candidat;
    		$this->prenom_candidat 		= $prenom_candidat;
    		$this->dateNaissance 		= $dateNaissance;
    		$this->pays 				= $pays;
    		$this->mesDossiers 			= array();
    	}
    	
    	public function getNbdossier()
    	{
    		return count($this->mesDossiers);
    	}
    	
    	// Renvoi le nombre de dossiers par candidat
    	public function getNbDossiers($codeConnexion)
    	{
    		$query = mysql_query("	select count(*) 
    								from connexion, candidat, dossier 
    								where connexion.code_connexion = candidat.code_connexion 
    								and candidat.code_connexion = dossier.code_connexion 
    								and candidat.code_connexion=".$codeConnexion);
    		$nb_dossiers = mysql_fetch_array($query);
    		$NbrDossier = $nb_dossiers[0];
    		return $NbrDossier;
    	}
    	
    	//retourne le dossier
    	public function getDossier($indice)
    	{
    		// Vérifie que ce que tu veux retourner existe
            if(isset($this->mesDossiers[$indice])) 
    		    return $this->mesDossiers[$indice];
    		throw new Exception ("Cet indice n'existe pas.");
    	}
    	
    	public function setDossier($monDossier)
    	{
    		$this->mesDossiers[] = $monDossier;	}
    }

    bbye

Discussions similaires

  1. [POO] Prog objet php5
    Par masseur dans le forum Langage
    Réponses: 2
    Dernier message: 21/09/2006, 11h30
  2. [POO] Problème objets PHP5
    Par alliance dans le forum Langage
    Réponses: 2
    Dernier message: 16/08/2006, 17h39
  3. [POO] Classe en PHP5
    Par neptune dans le forum Langage
    Réponses: 5
    Dernier message: 01/09/2005, 17h55
  4. [POO] Modèle objet: this inutilisable dans certains cas?
    Par vlord dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 13/08/2005, 10h41
  5. Réponses: 3
    Dernier message: 19/05/2005, 10h46

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