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] agir sur les attributs d'une classe via une fonction d'une autre classe


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut [POO] agir sur les attributs d'une classe via une fonction d'une autre classe
    Bonjour, le problème est le suivant :

    J'ai une classe Agent et une classe Market
    la classe agent possède un attribut Stock et un attribut OnSale : il s'agit de tableau répertoriant les quantités de produit d'un agent selon leur état.
    Par exemple, un agent posséde initialement 5 cartes ($Stock['carte'] = 5), il en met 3 en vente sur le marché ($Stock['carte'] = 2, $OnSale['carte'] = 3).

    La mise en vente sur le marché se fait au sein de la classe Market via la fonction Sell suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      function Sell($Product, $Quantity, $Price, $Agent) {
        $this->Quantity[$Product][$this->NextTicket] = $Quantity;
        $this->Price[$Product][$this->NextTicket] = $Price;
        $this->Seller[$Product][$this->NextTicket] = $Agent;
        $Agent->Stock[$Product] = $Agent->Stock[$Product] - $Quantity;
        // echo $Agent->Stock[$Product];
        $Agent->OnSale[$Product] = $Agent->OnSale[$Product] + $Quantity;
        // echo $Agent->OnSale[$Product];
        $this->NextTicket++;
      }
    $Product est un string, $Quantity et $Price sont des nombres, $Agent est un objet

    Le problème se situe au niveau des lignes de mise à jour de l'objet agent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        $Agent->Stock[$Product] = $Agent->Stock[$Product] - $Quantity;   
        $Agent->OnSale[$Product] = $Agent->OnSale[$Product] + $Quantity;
    Si par exemple, l'agent qui possède initialement 5 cartes, en met 3 en ventes sur le marché à 2€ puis 1 à 3€, ces deux opérations se traduisent par le code suivant :
    [CODE]
    // Sell($Product, $Quantity, $Price, $Agent)
    $marche->Sell('Carte', '3', '2', $vendeur);
    $marche->Sell('Carte', '1', '3', $vendeur);
    [CODE]

    En principe à l'issue de ces deux opérations, on devrait avoir
    $vendeur->Stock['carte'] = 1;
    $vendeur->OnSale['carte'] = 4;

    or, j'ai :
    $vendeur->Stock['carte'] = 5;
    $vendeur->OnSale['carte'] (inexistant)
    les attributs de l'agent ne sont pas mis à jour par la fonction Sell

    Par contre, en plaçant un echo au sein de la fonction Sell, on s'aperçoit que les opérations sont bien menées mais qu'elles ne sont pas persistantes au delà de la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      function Sell($Product, $Quantity, $Price, $Agent) {
        // ...
        $Agent->Stock[$Product] = $Agent->Stock[$Product] - $Quantity;
        echo $Agent->Stock[$Product];
        $Agent->OnSale[$Product] = $Agent->OnSale[$Product] + $Quantity;
        echo $Agent->OnSale[$Product];
        // ...
      }
    dans mon exemple, j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // stock initial = 5
    $marche->Sell('Carte', '3', '2', $vendeur);
    echo $Agent->Stock[$Product]; // (au sein de la fonction donne 2 (5-3)
    echo $Agent->OnSale[$Product]; // (au sein de la fonction donne 3 (0+3)
    $marche->Sell('Carte', '1', '3', $vendeur);
    echo $Agent->Stock[$Product]; // (au sein de la fonction donne 4 (5-1)
    // ce devrait être 1 (2-1), la première opération (5-3) n'a pas eu d'influence //au dela de la fonction
    echo $Agent->OnSale[$Product]; // (au sein de la fonction donne 1 (0+1)
    // ce devrait être 4 (3+1), la première opération (0+3) n'a pas eu d'influence //au dela de la fonction
    Comment faire pour avoir un code qui permette d'agir depuis la fonction Sell de la classe Market de façon persistante sur les attributs Stock et OnSale de la classe Agent ?

  2. #2
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Bonjour,

    Pour que les modifications soient persistantes au delà de la fonction, il faudrait passer l'argument agent par référence de façon à ce que la fonction ne travaille pas sur une copie.

    http://www.php.net/manual/fr/functions.arguments.php
    http://thierrylhomme.developpez.com/..._php/#pass_arg
    Pierre
    1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
    2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
    3. Un code rapide c'est bien, un code maintenable c'est mieux
    ...

    Why was the font tag an orphan ? Because it didn't have a font-family.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup, parce que c'est simplissime à corriger, mais sans ton aide, j'aurai sans doute cherché longtemps.
    (... et je suis quand même satisfait de constater que mes relations entre objets étaient au fond assez saines)

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

Discussions similaires

  1. Boucle sur les attributs d'une classe
    Par lefty972 dans le forum Langage
    Réponses: 1
    Dernier message: 21/06/2012, 19h04
  2. Réponses: 5
    Dernier message: 07/05/2012, 17h20
  3. [Flex4] binding sur les attributs d'une classe
    Par j-jorge dans le forum Flex
    Réponses: 1
    Dernier message: 09/09/2010, 13h26
  4. Réponses: 1
    Dernier message: 19/04/2007, 02h37
  5. [SQL] Besoin d'aide sur les attributs pour une requete
    Par bobobobo01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/11/2006, 21h39

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