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 :

Liaison entre 2 classes


Sujet :

Langage PHP

  1. #1
    Membre du Club Avatar de arwin
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 59
    Points : 42
    Points
    42
    Par défaut Liaison entre 2 classes
    Bonjour,
    j'ai 2 classes Arme et Player à instancier et à afficher. Dans Arme il y a un id auto-incrémenté et et un tableau $armes en static.

    Dans Player il y a un idArme qui le relie à Arme.

    J'ai écris mes classes et mon index.php. Lors de l'affichage du player pas de soucis mais je n'arrive pas à afficher les infos de l'arme correspondante.

    Dans index.php (ligne 28):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        $arme = Arme::recupererArme($player->getIdArme());
    ça m'affiche le message d'erreur suivant :
    Fatal error: Uncaught Error: Call to a member function getIdArme() on null
    Pourtant un var_dump de montre qu'il y a bien une valeur ().

    Voici le code et merci pour votre aide :

    classe Arme (pour alléger je n'ai pas mis les getters/setters) :

    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
     
    <?php
     
    class Arme
    {
        private static $compteur = 1;
        private $id;
        private $nom;
        private $degat;
        private static $armes = []; // Pour faire la liaison entre arme et player
        // Puis écrire une fonction qui récupère une arme en
        // fonction de l'id .
     
        public function __contruct($nom, $degat)
        {
            $this->setNom($nom);
            $this->setDegat($degat);
            $this->id = self::$compteur;
            self::$compteur++;
            self::$armes[] = $this;
        }
     
        public static function recupererArme($id)
        {
            foreach (self::$armes as $arme) {
                if ($arme->id === $id) {
                    return $arme;
                }
            }
        }

    Classe Player :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php 
    class Player{
        private $nom;
        private $force;
        private $pv;
        private $idArme;
     
        public function __construct(){
            $this->setForce(5);
            $this->setPv(100);
        }
    index.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
     
    <?php
    require 'Arme.php';
    require 'Player.php';
     
     
    $player1 = new Player();
    $player1->setNom("Milo");
    $player1->setIdArme(1);
     
    $player2 = new Player();
    $player2->setNom("Tya");
    $player2->setIdArme(2);
     
    $players = [$player1, $player2];
     
     
    $arme1 = new Arme("Hache", 10);
    $arme2 = new Arme("Epée", 8);
     
    foreach ($players as $player) {
        echo "<br>"; 
        echo "Nom :" . $player->getNom() . "<br>"; 
        echo "Force :" . $player->getForce() . "<br>"; 
        echo "PV :" . $player->getPV() . "<br>"; 
     
        echo "Arme :<br>"; 
        $arme = Arme::recupererArme($player->getIdArme());
        var_dump($player->getIdArme());
        echo "id :" . $arme->getId() . "<br>"; 
        echo "Nom :" . $arme->getNom() . "<br>"; 
        echo "Dégat :" . $arme->getDegat() . "<br>"; 
        echo "----------------";
    }

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 316
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 316
    Points : 15 651
    Points
    15 651
    Par défaut
    avec des morceaux de classes qui manquent, on peut difficilement reproduire votre souci.
    donnez nous un morceau de code complet qui produit votre erreur.

  3. #3
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 436
    Points : 4 930
    Points
    4 930
    Par défaut
    Bonjour,

    Il manque un "s" dans le nom du constructeur de Arme:
    c'est __construct et pas __contruct.

    La coloration syntaxique est utile.

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 198
    Points : 8 423
    Points
    8 423
    Billets dans le blog
    17
    Par défaut
    La démarche n'est pas claire. Pourquoi stocker toutes tes armes dans la classe Arme ? Pour cela tu devrais plutôt utiliser un tableau ou une classe Armurerie.

    Tu fais un setIdArme() avant que l'arme n'existe, ça ne pose pas de problème ?

  5. #5
    Membre du Club Avatar de arwin
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 59
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par mathieu Voir le message
    avec des morceaux de classes qui manquent, on peut difficilement reproduire votre souci.
    donnez nous un morceau de code complet qui produit votre erreur.
    J'ai tout mis .. sauf les getters/setter

    Classe Arme :

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
    <?php
     
    class Arme
    {
        private static $compteur = 1;
        private $id;
        private $nom;
        private $degat;
        private static $armes = []; // Pour faire la liaison entre arme et player
        // Puis écrire une fonction qui récupère une arme en
        // fonction de l'id .
     
        public function __contruct($nom, $degat)
        {
            $this->setNom($nom);
            $this->setDegat($degat);
            $this->id = self::$compteur;
            self::$compteur++;
            self::$armes[] = $this;
        }
     
        public static function recupererArme($id)
        {
            foreach (self::$armes as $arme) {
                if ($arme->id === $id) {
                    return $arme;
                }
            }
        }
     
        /**
         * Get the value of nom
         */
        public function getNom()
        {
            return $this->nom;
        }
     
        /**
         * Set the value of nom
         *
         * @return  self
         */
        public function setNom($nom)
        {
            $this->nom = $nom;
     
            return $this;
        }
     
        /**
         * Get the value of degat
         */
        public function getDegat()
        {
            return $this->degat;
        }
     
        /**
         * Set the value of degat
         *
         * @return  self
         */
        public function setDegat($degat)
        {
            $this->degat = $degat;
     
            return $this;
        }
     
        /**
         * Get the value of compteur
         */
        public function getCompteur()
        {
            return $this->compteur;
        }
     
        /**
         * Set the value of compteur
         *
         * @return  self
         */
        public function setCompteur($compteur)
        {
            $this->compteur = $compteur;
     
            return $this;
        }
     
        /**
         * Get the value of Armes
         */
        public function getArmes()
        {
            return $this->Armes;
        }
     
        /**
         * Set the value of Armes
         *
         * @return  self
         */
        public function setArmes($Armes)
        {
            $this->Armes = $Armes;
     
            return $this;
        }
    }
    Classe Player :

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    <?php 
    class Player{
        private $nom;
        private $force;
        private $pv;
        private $idArme;
     
        public function __construct(){
            $this->setForce(5);
            $this->setPv(100);
        }
     
        /**
         * Get the value of nom
         */ 
        public function getNom()
        {
            return $this->nom;
        }
     
        /**
         * Set the value of nom
         *
         * @return  self
         */ 
        public function setNom($nom)
        {
            $this->nom = $nom;
     
            return $this;
        }
     
        /**
         * Get the value of force
         */ 
        public function getForce()
        {
            return $this->force;
        }
     
        /**
         * Set the value of force
         *
         * @return  self
         */ 
        public function setForce($force)
        {
            $this->force = $force;
     
            return $this;
        }
     
        /**
         * Get the value of pv
         */ 
        public function getPv()
        {
            return $this->pv;
        }
     
        /**
         * Set the value of pv
         *
         * @return  self
         */ 
        public function setPv($pv)
        {
            $this->pv = $pv;
     
            return $this;
        }
     
        /**
         * Get the value of idArme
         */ 
        public function getIdArme()
        {
            return $this->idArme;
        }
     
        /**
         * Set the value of idArme
         *
         * @return  self
         */ 
        public function setIdArme($idArme)
        {
            $this->idArme = $idArme;
     
            return $this;
        }
    }

  6. #6
    Membre du Club Avatar de arwin
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 59
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par Toufik83 Voir le message
    Bonjour,

    Il manque un "s" dans le nom du constructeur de Arme:
    c'est __construct et pas __contruct.

    La coloration syntaxique est utile.
    J'ai corrigé le "s" et ça m'a donné ce message d'erruer :

    Fatal error: Uncaught Error: Call to undefined method Arme::getId() in E:
    Citation Envoyé par Séb. Voir le message
    La démarche n'est pas claire. Pourquoi stocker toutes tes armes dans la classe Arme ? Pour cela tu devrais plutôt utiliser un tableau ou une classe Armurerie.

    Tu fais un setIdArme() avant que l'arme n'existe, ça ne pose pas de problème ?
    Le tableau $armes est static pour pouvoir l'utiliser ailleurs ... setIdArme() est utilisé après la déclaration des armes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $arme1 = new Arme("Hache", 10);
    $arme2 = new Arme("Epée", 8);
     
    $player1 = new Player();
    $player1->setNom("Milo");
    $player1->setIdArme(1);

  7. #7
    Rédacteur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 608
    Points : 1 561
    Points
    1 561
    Par défaut
    T'as mis tout le code cette fois-ci ? Si oui c'est normal que tu aies une erreur, la méthode getId() n'a pas été définie.

    Et tu as un problème avec tes getters et setters de compteur et armes parce que les variables privées sont statiques mais les getters et setters ne le sont pas. Tu devrais avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static function getCompteur()
        {
            return self::$compteur;
        }

  8. #8
    Membre du Club Avatar de arwin
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 59
    Points : 42
    Points
    42
    Par défaut
    Yesss !!! ça marche merci Nightfall et merci pour vous tous ... pourtant j'ai creusé de ce coté mais je pense que j'ai pas bien fait les getters/setters (je me suis contenté des l'ajout automatique dans VSC mais manifestement il n'a pas tenu compte du caractère static.)

    Question subsidiaire :
    Dans le setter, dans le cas où on veut faire du chaînage on peut mettre à la fin du setter : return $this ... qu'est ce qu'on écrit dans le cas d'un setter static : return self ??

    exemple du chaînage dont je parle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $sessions
                  ->setTraining(.....)
                  ->setTrainerTitle(.....)
                  ->setManagerTitle(.....);

  9. #9
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 436
    Points : 4 930
    Points
    4 930
    Par défaut
    Bonjour,

    Normalement return new self; devrait suffire.

  10. #10
    Membre du Club Avatar de arwin
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 59
    Points : 42
    Points
    42
    Par défaut
    Merci Toufik83 et merci à vous tous.
    Je passe en résolue

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/11/2005, 11h12
  2. Comparaison entre les classes et les fonctions
    Par Ashgenesis dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 08/09/2005, 19h09
  3. Réponses: 5
    Dernier message: 17/08/2005, 12h40
  4. Pb accès entre 2 classes static
    Par d.w.d dans le forum C++
    Réponses: 5
    Dernier message: 23/02/2005, 19h05
  5. [Rave et base] liason entre mes 2 tables
    Par Pascal dans le forum Bases de données
    Réponses: 2
    Dernier message: 16/06/2004, 17h19

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