Difficulté à faire communiquer 2 objets

Eléphant du PHP | 135 Messages

06 sept. 2008, 21:47

Bonjour à toutes et à tous ! :D

Voilà je me suis mis à la POO php !
je voudrais pour pour apprendre faire une petite application comme un repertoire de contact avec bien sur ajouter, supprimer, update etc

Ma difficulté n'est pas de crée un class n'y même une methode mais de faire communiquer les objets entre eux !

je sais faire une Class, l'instancier avec des GETTER, SETTER constructeur, toString...

mais j'ai du mal à aller plus loin ! je trouve des tutoriaux sur le net ou dans des livres mais trop lourd et long pour comprendre

Exemple:

je créer un class Contact avec des attributs nom, prenom, adresse etc puis les methodes get et set...

mais je voudrais par exemple avec un autre objet me servir de cette class Contact

par exemple pour faire une collection d'objet contact !

et peut etre une class Repertoire qui avec une methode ajouteContact ou j'utiliserai un array_push etc

voila c'est la que j'ai du mal à avancer si quelqu'un pouvait m'aider ca serait sympas ! :)

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

06 sept. 2008, 22:11

Bonsoir,

Ce sujet est peut être traité ici : http://www.phpfrance.com/forums/viewtop ... highlight=

Bonne lecture.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 135 Messages

06 sept. 2008, 22:40

merci de m'avoir répondu si vite !

le liens est bon j'etais tomber dessus y'a pas longtemps !

mais je voulais eviter la base de donnée je voudrais juste un petit exemple avec un array simple

en faite je l'ai fais en JAVA et c'est plus simple pour moi parce qu'il existe un interface List et que on peux aussi
mettre le type genre Contact c = new Contact();

et j'utilisais le Pattern DAO

j'ai vue dans un livre un methode pour un panier du genre :

Code : Tout sélectionner

public function ajoute(Produit $produit) { [...] }
cette methode est dans une class panier et il peux appeler sans mettre de require dedans et utilisé des methodes de la class produit !

car il met les require dans un fichier pour afficher le panier et le traiter

c'est un peu ça que je cherche à faire mais ca ne marche pas !

j'ai l'impression d'etre à l'ouest lool j'ai été pas mal habitué à JAVA :D


Merçi pour ton aide Sadeq

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

07 sept. 2008, 05:49

Bon, je vais t'expliquer par l'exemple en java et php comme ça tu vas voir les différence de codage:

L'exemple illustre un pseudo fonctionnement d'un panier électronique dont voici, le modèle conceptuel de classes :

Soit 2 entités "Produit" et "Panier" reliées par une relation fonctionnelle bidirectionnelle : "Un panier contient N Produits" et "Un produit peut apparaitre dans N paniers"
C'est une relation N <--> N

1) Classe Produit : définissant l'objet "produit" sujet de l'achat
  • Propriétés privées :
    Produit ::reference : entier
    Produit ::nom : texte
    Produit ::prix : réel

    Méthodes publiques :
    Produit ::setRef(valeur : entier), Produit ::setNom(valeur : texte), Produit ::setPrix(valeur : réel)
    Produit ::getRef(), Produit ::getNom(), Produit ::getPrix()
2) Classe Panier: définissant l'objet "panier" conteneur d'objets "produit" achetés
  • Propriétés privées :
    Panier::id : entier
    Panier::date: date/heure
    Panier::client : instance d'une classe "Client" (non incluse dans cet exemple)

    Méthodes publiques :
    Panier::setId(valeur : entier), Panier::setDate(date : date/heure), Panier::setClient(client: Client)
    Panier::getId(), Panier::getDate(), Panier::getClient()
Voilà pour les entités. Maintenant, la relation Panier/Produit est une classe intermédiaire dont les instances font le croisement entre les produits et leurs paniers, on peut dire donc que cette classe représente un lien entre un panier et un produit quantifié :

3) Classe ProduitPanier: définissant une liaison entre un objet "produit" et un "Panier"
  • Propriétés privées :
    ProduitPanier::panier : instance d'une classe "Panier"
    ProduitPanier::produit: instance d'une classe "Produit"
    ProduitPanier::quantite : entier (nombre d'unités du même produit acheté)

    Méthodes publiques :
    ProduitPanier::setPanier(panier : Panier), ProduitPanier::setProduit(produit: Produit), ProduitPanier::setQuantite(valeur : entier)
    ProduitPanier::getPanier(), ProduitPanier::getProduit(), ProduitPanier::getQuantite()
4) Mettre à jour la classe "Panier" pour ajouter la relation "Un panier contient N produits" relation représentée par N objets de la classe "ProduitPanier".
Ajouter aussi les méthodes pour gérer la liste des produits du panier, permettant d'ajouter un produit, d'en récupèrer un ou tous les produits, d'en supprimer un ou tout et d'afficher le contenu du panier:
  • Propriétés privées :
    Panier::listeProduits[N] : Liste de N objets de la classe "ProduitPanier"
    Méthodes publiques :
    Panier::setListeProduits(listeProduits[N] : N ProduitPanier)
    Panier::getListeProduits()
    Panier::ajouterProduit(Produit p, int qte)
    Panier::getTousProduits()
    Panier::getUnProduit(reference : entier)
    Panier::supprimerProduit(reference : entier)
    Panier::vider()
    Panier::afficher()
Dans le modèle de traitement, dans le domaine d'achat, on traite un panier à la fois en permettant de l'identifier et enregistrer les produits achetés en les associant au panier à travers la relation "ProduitPanier".

L'algorithme est donc le suivant :
  • 1. Créer une instance de Panier pour le client en cours, car un panier implique un achat client
    2. Pour ce panier créé, permettre l'ajout d'un ou plusieurs produits quantifiés dans une collection d'objets de classe "ProduitPanier" qui est la relation entre le panier et ses produits.
    3. Afficher le contenu du panier.
Et maintenant le codage en java :
/**
 *
 * @author sadeq
 */

class Client {
    private int id;
    private String nom;

    Client(int id, String nom) {
        this.setId(id);
        this.setNom(nom);
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNom() {
        return nom;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }
}
-----------------------------------------------------------------------------
public class Produit {
    private int reference;
    private String nom;
    private float prix;

    Produit(int reference, String nom, float prix) {
        this.setReference(reference);
        this.setNom(nom);
        this.setPrix(prix);
    }

    public String getNom() {
        return nom;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

    public float getPrix() {
        return prix;
    }

    public void setPrix(float prix) {
        this.prix = prix;
    }

    public int getReference() {
        return reference;
    }

    public void setReference(int reference) {
        this.reference = reference;
    }

}
------------------------------------------------------------------------------------------
public class ProduitPanier {
    private Panier panier;
    private Produit produit;
    private int quantite;

    public Panier getPanier() {
        return panier;
    }

    public void setPanier(Panier panier) {
        this.panier = panier;
    }

    public Produit getProduit() {
        return produit;
    }

    public void setProduit(Produit produit) {
        this.produit = produit;
    }

    public int getQuantite() {
        return quantite;
    }

    public void setQuantite(int quantite) {
        this.quantite = quantite;
    }
}
--------------------------------------------------------------------------------------
import java.util.ArrayList;
import java.util.Date;
public class Panier {

    private int id;
    private Date LaDate;
    private Client client;
    private ArrayList listeProduits = new ArrayList();

    public ArrayList getListeProduits() {
        return listeProduits;
    }

    public void setListeProduits(ArrayList listeProduits) {
        this.listeProduits = listeProduits;
    }

    public Date getLaDate() {
        return LaDate;
    }

    public void setLaDate(Date LaDate) {
        this.LaDate = LaDate;
    }

    public Client getClient() {
        return client;
    }

    public void setClient(Client client) {
        this.client = client;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Panier(int id, Client c) {
        this.setId(id);
        this.setLaDate(new Date());
        this.setClient(c);
    }

    public void ajouterProduit(Produit p, int qte) {
        ProduitPanier pp = this.getUnProduit(p.getReference());
        if (pp == null) {
            pp = new ProduitPanier();
            pp.setPanier(this);
            pp.setProduit(p);
            pp.setQuantite(qte > 0 ? qte : 1);
            this.listeProduits.add(pp);
        } else {
            pp.setQuantite(pp.getQuantite() + (qte > 0 ? qte : 1));
        }
    }

    public ArrayList getTousProduits() {
        ArrayList liste = new ArrayList();
        for (int i = 0; i < this.listeProduits.size(); i++) {
            ProduitPanier pp = (ProduitPanier) this.listeProduits.get(i);
            if (pp.getPanier().getId() == this.getId()) {
                liste.add(pp);
            }
        }
        return liste;
    }

    public ProduitPanier getUnProduit(int refProduit) {
        for (int i = 0; i < this.listeProduits.size(); i++) {
            ProduitPanier pp = (ProduitPanier) this.listeProduits.get(i);
            if (pp.getPanier().getId() == this.getId() 
                    && pp.getProduit().getReference() == refProduit) {
                return pp;
            }
        }
        return null;
    }

    public boolean supprimerProduit(int refProduit) {
        ProduitPanier pp = (ProduitPanier) this.getUnProduit(refProduit);
        if (pp != null && this.listeProduits.remove(pp)) {
            return true;
        } else {
            return false;
        }
    }

    public void vider() {
        this.listeProduits.clear();
    }

    public void afficher() {
        String out = "";
        out += "Votre Panier n°" + this.getId() + ", ";
        out += "Date: " + this.getLaDate() + "\n";
        out += "Client Id: " + this.getClient().getId() + ", ";
        out += "Nom: " + this.getClient().getNom() + "\n";
        out += "=============================\n";
        ArrayList liste = this.getTousProduits();
        float totalPanier = 0;
        for (int i = 0; i < liste.size(); i++) {
            ProduitPanier pp = (ProduitPanier) liste.get(i);
            out += "Produit n°: " + pp.getProduit().getReference() + ", ";
            out += "Nom: " + pp.getProduit().getNom() + ", ";
            out += "Prix: " + pp.getProduit().getPrix() + ", ";
            out += "Qté: " + pp.getQuantite() + ", ";
            out += "Montant: " + pp.getQuantite() * pp.getProduit().getPrix() + "\n";
            totalPanier += pp.getQuantite() * pp.getProduit().getPrix();
        }
        out += "=============================\n";
        out += "Total (HT): " + totalPanier + "\n";
        out += "TVA (19%): " + totalPanier * 0.19 + "\n";
        out += "Total (TTC): " + totalPanier * 1.19;
        System.out.println(out);
    }
}

----------------------------------------------------------------------------
public class Main {

    /**
     * @param args the command line arguments
     */
    private static Panier panier;
    public static void main(String[] args) {
        //1. Créer un panier de travail pour un client
        Main.panier = new Panier(1, new Client(1, "Toto"));
        //2. Enregistrer des achats pour le client
        Main.panier.ajouterProduit(new Produit(1, "Ecran TFT 19'", 200.00f), 1);
        Main.panier.ajouterProduit(new Produit(2, "PC Centrino Core 2 Duo T7300", 700.00f), 10);
        Main.panier.ajouterProduit(new Produit(3, "Disque USB 500Go", 90.00f), 5);
        //3. Afficher le contenu du panier
        Main.panier.afficher();
    }
}
Et voici la version PHP où toutes les classes sont écrites dans la même page. Mais il est possible de séparer les classes du programme principal en les mettant dans une autre page tout en la référençant dans le programme principal par un "require_once()" instruction qui permet d'inclure une page externe dans un programme.
<?php
/**
 *
 * @author sadeq
 */
 
class Client {
    private  $id;
    private  $nom;

    function Client( $id, $nom) {
        $this->setId($id);
        $this->setNom($nom);
    }

    public function   getId() {
        return $this->id;
    }

    public function   setId( $id) {
        $this->id = $id;
    }

    public function  getNom() {
        return $this->nom;
    }

    public function   setNom($nom) {
        $this->nom = $nom;
    }
}
class Produit {
    private $reference;
    private $nom;
    private $prix;

    function Produit( $reference, $nom, $prix) {
        $this->setReference($reference);
        $this->setNom($nom);
        $this->setPrix($prix);
    }

    public function  getNom() {
        return $this->nom;
    }

    public function   setNom($nom) {
        $this->nom = $nom;
    }

    public function  getPrix() {
        return $this->prix;
    }

    public function   setPrix($prix) {
        $this->prix = $prix;
    }

    public function   getReference() {
        return $this->reference;
    }

    public function   setReference( $reference) {
        $this->reference = $reference;
    }

}
class ProduitPanier {
    private $panier;
    private $produit;
    private $quantite;

    public function  getPanier() {
        return $this->panier;
    }

    public function  setPanier($panier) {
        $this->panier = $panier;
    }

    public function  getProduit() {
        return $this->produit;
    }

    public function  setProduit($produit) {
        $this->produit = $produit;
    }

    public function  getQuantite() {
        return $this->quantite;
    }

    public function  setQuantite( $quantite) {
        $this->quantite = $quantite;
    }
}

class Panier {

    private $id;
    private $LaDate;
    private $client;
    private $listeProduits = array();

    public function  getListeProduits() {
        return $this->listeProduits;
    }

    public function   setListeProduits($listeProduits) {
        $this->listeProduits = $listeProduits;
    }

    public function  getLaDate() {
        return $this->LaDate;
    }

    public function   setLaDate($LaDate) {
        $this->LaDate = $LaDate;
    }

    public function  getClient() {
        return $this->client;
    }

    public function   setClient($client) {
        $this->client = $client;
    }

    public function   getId() {
        return $this->id;
    }

    public function   setId( $id) {
        $this->id = $id;
    }

    public function  Panier( $id, $c) {
        $this->setId($id);
        $this->setLaDate(date("d-m-Y"));
        $this->setClient($c);
    }

    public function  ajouterProduit($p,  $qte) {
        $pp = $this->getUnProduit($p->getReference());
        if ($pp == null) {
            $pp = new ProduitPanier();
            $pp->setPanier($this);
            $pp->setProduit($p);
            $pp->setQuantite($qte > 0 ? $qte : 1);
            $this->listeProduits[] = $pp;
        } else {
            $pp->setQuantite($pp->getQuantite() + ($qte > 0 ? $qte : 1));
        }
    }

    public function  getTousProduits() {
        $liste = array();
        for ( $i = 0; $i < count($this->listeProduits); $i++) {
            $pp = $this->listeProduits[$i];
            if ($pp->getPanier() == $this) {
                $liste[] = $pp;
            }
        }
        return $liste;
    }

    public function  getUnProduit($refProduit) {
        for ( $i = 0; $i < count($this->listeProduits); $i++) {
            $pp = $this->listeProduits[$i];
            if ($pp->getPanier()->getId()== $this->getId() && $pp->getProduit()->getReference()== $refProduit) {
                return $pp;
            }
        }
        return null;
    }

    public function supprimerProduit($refProduit) {
       for ( $i = 0; $i < count($this->listeProduits); $i++) {
            $pp = $this->listeProduits[$i];
            if ($pp->getPanier()->getId()== $this->getId() && $pp->getProduit()->getReference()== $refProduit) {
               unset ($this->listeProduits[$i]); 
               $this->listeProduits = array_values($this->listeProduits);
               return true;
            }
        }
        return false;
    }

    public function vider() {
        unset ($this->listeProduits);
    }

    public function   afficher() { 
        $out = "";
        $out .= "Votre Panier n°" . $this->getId() . ", ";
        $out .= "Date: " . $this->getLaDate() . "<br />";
        $out .= "Client Id: " . $this->getClient()->getId() . ", ";
        $out .= "Nom: " . $this->getClient()->getNom() . "<br />";
        $out .= "=============================<br />";
        $liste = $this->getTousProduits();
        $totalPanier = 0;
        for ( $i = 0; $i < count($liste); $i++) {
            $pp = $liste[$i];
            $out .= "Produit n°: " . $pp->getProduit()->getReference() . ", ";
            $out .= "Nom: " . $pp->getProduit()->getNom() . ", ";
            $out .= "Prix: " . $pp->getProduit()->getPrix() . ", ";
            $out .= "Qté: " . $pp->getQuantite() . ", ";
            $out .= "Montant: " . $pp->getQuantite() * $pp->getProduit()->getPrix() . "<br />";
            $totalPanier += $pp->getQuantite() * $pp->getProduit()->getPrix();
        }
        $out .= "=============================<br />";
        $out .= "Total (HT): " . $totalPanier . "<br />";
        $out .= "TVA (19%): " . $totalPanier * 0.19 . "<br />";
        $out .= "Total (TTC): " . $totalPanier * 1.19;
        echo($out);
    }
}

// Main
    //1-> Créer un panier de travail pour un client
        $self->panier = new Panier(1, new Client(1, "Toto"));
    //2-> Enregistrer des achats pour le client
        $self->panier->ajouterProduit(new Produit(1, "Ecran TFT 19'", 200.00), 1);
        $self->panier->ajouterProduit(new Produit(2, "PC Centrino Core 2 Duo T7300", 700.00), 10);
        $self->panier->ajouterProduit(new Produit(3, "Disque USB 500Go", 90.00), 5);
    //3-> Afficher le contenu du panier
        $self->panier->afficher();
// Fin->
?>
Les différences entre la version java et PHP sont :
  • 1. Le typage (propriétés et méthodes) de java n'est pas supporté par PHP.
    2. Le casting (conversion directe) d'objet de java n'est pas supporté par PHP.
    3. La classe ArrayList de java est simplement remplacée par un tableau dynamique de PHP (array()), l'ajout ArrayList.add(valeur) correspond à un ajout de case dans le array() de PHP en écrivant tableau[] = valeur. En plus, PHP stocke l'objet dans le tableau array() sans qu'il perde son identité de classe ce qui permet de ne pas utiliser le casting à la récup de l'objet stocké pour se différencier des collection de java. En effet, l'objet stocké dans un ArrayList en java est encapsulé dans un conteneur de type Object (non identifié) ce qui oblige un casting à la récupération de l'objet vers son identité de classe avant son usage.
    4. En java, chaque classe consomme un fichier ce qui n'est pas obligatoire sous PHP car ce dernier ne compile pas les classes avant l'usage car PHP est un interpréteur.
    5. Le programme principal sous java est une classe aussi qui contient forcement un point d'entrée statique (Main), des méthodes et propriétés statiques. Ce qui n'est pas le cas pour PHP car pour ce dernier, le code principal se trouve directement écrit en linéaire dans la page chargé par l'interpréteur.
Et bien d'autres différences qu'on voit pas forcement ici.
Modifié en dernier par sadeq le 07 sept. 2008, 13:03, modifié 4 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 135 Messages

07 sept. 2008, 12:07

Un grand merci à toi Sadeq ! :D

merci pour cette merveilleuse explication et tous ces detailles et le temps passer pour me l'expliquer !

ca fais plaisir de voir que des personnes prennent un peu de leurs temps pour aider les autres !

je vais bien me pencher sur ces differences et l'etudié en profondeur !

je laisse le post ouvert si j'ai encore une ou deux question ou bien pour ajouter une solution dans ce que j'ai compris pour agémenter ce post et pourquoi pas aider les autres !

Big Up !

Eléphant du PHP | 135 Messages

11 sept. 2008, 12:01

Bonjour à toutes et à tous !

Bon et bien après avoir medité sur la question je reviens pour donner quelque infos supplémentaire !

La demonstration de Sadeq au dessus es très bien expliquer et detaillé cependant j'ai voulu enrichir mes connaissances et les partagées!
Le typage dans php 5 existe mais il est très faible et casi inexistant contrairement à d'autre language exemple JAVA !
pour les curieux voici un lien qui en parle .

http://fr.php.net/manual/fr/language.oo ... inting.php

j'avais vu ça dans un livre mais sans trop d'explication donc si ça peux aider quelqu'un tant mieux :D

Bon courage ! ElePHPant