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/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.