Le plan et les maisons
La classe est le plan de l'architecte ; chaque objet est une maison construite d'après ce plan, avec sa propre adresse et sa propre couleur de porte. new Produit(...) construit une maison.
Pourquoi programmer en objet en PHP, écrire une classe avec propriétés et méthodes, le constructeur (et sa forme courte), $this, la visibilité public / private / protected, getters et setters, constantes et membres statiques.
Au module 03, vous avez appris la POO en Python. Le site de Souk Atlas grossit : produits, clients, paniers, commandes. Plutôt que des tableaux et des fonctions éparpillés, on regroupe chaque notion dans une classe qui contient ses données et ses règles. C'est aussi ainsi que sont écrits PDO, DateTime et tous les frameworks PHP (Laravel, Symfony).
La classe Produit est le moule : elle déclare des propriétés (nom, prix, stock) et des méthodes (vendre, afficher).
Ce que la POO apporte à un site PHP :
vendre() ;Produit sert au catalogue, au panier et à l’administration ;class Produit
{
public string $nom;
public float $prix;
public function prixTtc(): float
{
return $this->prix * 1.2;
}
}
$savon = new Produit();
$savon->nom = "Savon noir";
$savon->prix = 30;
echo $savon->prixTtc(); // 36
$this désigne l’objet sur lequel la méthode est appelée : dans $savon->prixTtc(), $this est $savon. Par convention, le nom d’une classe commence par une majuscule, et on range chaque classe dans un fichier du même nom (Produit.php).
class Produit
{
// forme courte (PHP 8) : déclare et remplit $nom, $prix et $stock
public function __construct(
public string $nom,
private float $prix,
private int $stock = 0,
) {}
}
$tajine = new Produit("Tajine décoré", 180, 14);
Forme longue équivalente : déclarer public string $nom; en haut de la classe, puis $this->nom = $nom; dans le constructeur.
class Produit
{
public function __construct(public string $nom, private float $prix, private int $stock = 0) {}
public function getStock(): int
{
return $this->stock;
}
public function vendre(int $quantite): void
{
if ($quantite > $this->stock) {
throw new Exception("Stock insuffisant pour {$this->nom}");
}
$this->stock -= $quantite;
}
}
$p = new Produit("Tapis berbère", 1200, 3);
try {
$p->vendre(5);
} catch (Exception $e) {
echo $e->getMessage();
}
throw new Exception("...") signale une erreur ; try { ... } catch (Exception $e) { ... } l’attrape pour afficher un message propre au lieu d’une erreur fatale.
class Produit
{
public const TVA = 0.20;
private static int $nombre = 0;
public function __construct(public string $nom)
{
self::$nombre++;
}
public static function nombre(): int
{
return self::$nombre;
}
}
new Produit("Tajine");
new Produit("Savon");
echo Produit::nombre(), " produits, TVA ", Produit::TVA * 100, " %";
La classe est le plan de l'architecte ; chaque objet est une maison construite d'après ce plan, avec sa propre adresse et sa propre couleur de porte. new Produit(...) construit une maison.
On ne met pas la main dans le distributeur pour prendre une canette : on passe par les boutons (les méthodes publiques). Le stock à l'intérieur est privé : c'est l'encapsulation.
La page s'affichera ici.
Le navigateur demandera /index.php au serveur, qui exécutera le PHP et renverra du HTML.
Consignes 0 / 3
Écrivez une classe Client avec nom, prénom et email (privé), un constructeur, une méthode nomComplet() et un setter setEmail() qui refuse un email invalide.
<?php class Client { private string $email = ''; public function __construct(public string $nom, public string $prenom, string $email) { $this->setEmail($email); } public function nomComplet(): string { return "$this->prenom " . strtoupper($this->nom); } public function setEmail(string $email): void { if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { throw new InvalidArgumentException("Email invalide : $email"); } $this->email = strtolower($email); } public function getEmail(): string { return $this->email; } } $c = new Client("Benali", "Amina", "Amina.Benali@mail.ma"); echo $c->nomComplet() . " - " . $c->getEmail();
Ajoutez à Produit une propriété statique $nombre qui compte les produits créés, et affichez-la après la création de trois produits.
<?php class Produit { public static int $nombre = 0; public function __construct(public string $nom) { self::$nombre++; } } new Produit("Tajine"); new Produit("Savon"); new Produit("Tapis"); echo Produit::$nombre; // 3
Écrivez une classe Panier avec un tableau privé de lignes, une méthode ajouter(Produit $p, int $qte) et une méthode total().
<?php class Panier { private array $lignes = []; public function ajouter(Produit $p, int $qte = 1): void { $this->lignes[] = ['produit' => $p, 'qte' => $qte]; } public function total(): float { $t = 0; foreach ($this->lignes as $l) { $t += $l['produit']->prixTtc() * $l['qte']; } return $t; } }