De la théorie à la syntaxe PHP
Dans le cours « La POO expliquée simplement », tu as vu les idées : un objet regroupe des propriétés (données) et des méthodes (actions), et une classe est le moule. Ici, on traduit tout ça en PHP concret, et tu l'exécutes directement.
Petite note rassurante : la syntaxe objet de PHP ressemble beaucoup à celle de Java, C# ou JavaScript. Apprendre ici, c'est apprendre presque partout.
Déclarer une classe
Le mot-clé class, des propriétés (typées, c'est mieux) et des méthodes. À l'intérieur, $this désigne l'objet courant.
class Compte {
public string $titulaire; // une propriété typée
public float $solde = 0; // avec une valeur par défaut
public function deposer(float $montant): void {
$this->solde += $montant; // $this = CET objet
}
}
Note le -> (flèche) : en PHP, on accède aux propriétés et méthodes d'un objet avec $objet->propriete et $objet->methode(), pas avec un point.
Le constructeur : __construct
Le constructeur est la méthode spéciale __construct(), appelée automatiquement par new. C'est là qu'on initialise l'objet.
On déclare class Compte { public $titulaire; public $solde; function __construct($titulaire) { $this->titulaire = $titulaire; $this->solde = 0; } }. Puis on écrit $a = new Compte("Alice"); et $b = new Compte("Bob");. Avant de dérouler : quand est appelé __construct, que valent $a->solde et $b->solde juste après ces deux new, et que désigne $this dans le constructeur ?
Voir la réponse
__construct est appelé automatiquement par new, une fois par objet créé : c'est son rôle d'initialiser l'objet dès l'instanciation. $a->solde et $b->solde valent tous deux 0, mais ce sont deux cases mémoire distinctes : $a et $b sont deux objets indépendants, modifier l'un ne touche pas l'autre. $this désigne l'objet en cours de construction : lors du premier new, $this est $a ; lors du second, $this est $b. C'est ce qui permet à chaque objet d'initialiser ses propres propriétés sans interférer avec ses voisins.
class Compte {
public string $titulaire;
public float $solde = 0;
public function __construct(string $titulaire) {
$this->titulaire = $titulaire;
}
}
$compte = new Compte("Alice"); // __construct est appelé ici
echo $compte->titulaire; // Alice
Raccourci PHP 8 : la promotion de propriétés. Au lieu de déclarer la propriété puis de l'affecter dans le constructeur, on met la visibilité directement dans les paramètres. Ces deux versions sont équivalentes :
// Version courte (PHP 8) : déclare ET affecte $titulaire d'un coup
class Compte {
public float $solde = 0;
public function __construct(public string $titulaire) {}
}
Fabrique des objets (exécute !)
Une vraie classe PHP qui tourne sur le serveur. Chaque new Compte(...) crée un objet indépendant, avec son propre solde. Modifie le code, puis clique sur « Run ».
<?php
class Compte {
public float $solde = 0;
public function __construct(public string $titulaire) {}
public function deposer(float $montant): void {
$this->solde += $montant;
}
public function resume(): string {
return "{$this->titulaire} : {$this->solde} €";
}
}
$alice = new Compte("Alice");
$alice->deposer(120);
$bob = new Compte("Bob"); // un objet distinct, son propre solde
echo $alice->resume() . "\n"; // Alice : 120 €
echo $bob->resume() . "\n"; // Bob : 0 €
?>
À retenir
- Une classe se déclare avec
class Nom { ... }; on en fabrique des objets avecnew Nom(...). - Les propriétés portent un type (
float,string…) et, idéalement, une visibilité (on verrapublic/privateà la prochaine leçon). $thisdésigne l'objet courant ; on accède à ses membres avec->.- Le constructeur
__construct()initialise l'objet ; la promotion (PHP 8) le raccourcit.
Propriétés et méthodes statiques
Jusqu'ici, chaque objet possède ses propres propriétés : $alice->solde et $bob->solde sont des cases mémoire distinctes. Un membre statique fonctionne différemment : il appartient à la classe elle-même, pas à une instance. Il est partagé par tous les objets de cette classe, et accessible sans créer d'objet.
On le déclare avec le mot-clé static, et on y accède avec l'opérateur :: (double deux-points), appelé opérateur de résolution de portée :
- Depuis l'extérieur de la classe :
Compte::$compteur - Depuis l'intérieur de la classe :
self::$compteur
Cas d'usage typiques : un compteur d'instances (incrémenté dans __construct pour savoir combien d'objets ont été créés), ou une méthode utilitaire / fabrique (factory) qui n'a pas besoin d'un objet existant pour fonctionner.
<?php
class Compte {
public static int $compteur = 0; // propriété de classe, pas d'instance
public string $titulaire;
public function __construct(string $titulaire) {
$this->titulaire = $titulaire;
self::$compteur++; // incrémente le compteur partagé
}
public static function reinitialiser(): void {
self::$compteur = 0;
}
}
$a = new Compte("Alice");
$b = new Compte("Bob");
$c = new Compte("Charlie");
echo Compte::$compteur; // 3 (pas besoin d'instance pour y accéder)
?>
📝 Note : un membre statique est unique pour toute la classe : il n'existe qu'un seul $compteur, partagé par tous les objets. Ce n'est pas la même chose qu'un attribut d'instance, où chaque objet a sa propre copie. Si tu modifies Compte::$compteur, tous les objets voient le changement, parce qu'il n'y en a qu'un.
Les méthodes magiques
PHP réserve un ensemble de méthodes dont les noms commencent par __ (double underscore). Tu en connais déjà une : __construct. Ce sont des méthodes que PHP appelle automatiquement dans certaines situations, sans que tu les appelles toi-même.
Les plus utiles à connaître :
__toString(): string: appelée quand l'objet est utilisé comme une chaîne (dans unecho, une concaténation, unsprintf...). Très pratique pour afficher un objet lisiblement, en débogage ou en log.__get($nom)et__set($nom, $valeur): interceptent la lecture et l'écriture d'une propriété inaccessible ou inexistante. Utile pour des objets dynamiques, du logging automatique ou de la validation à la volée.
Il en existe d'autres (__call, __invoke, __clone...), mais le principe reste le même : PHP les appelle dans un contexte précis. À utiliser avec parcimonie : le code explicite reste plus lisible que le comportement « magique » quand les deux sont possibles.
<?php
class Produit {
public string $nom;
public float $prix;
public function __construct(string $nom, float $prix) {
$this->nom = $nom;
$this->prix = $prix;
}
public function __toString(): string {
return "{$this->nom} ({$this->prix} €)";
}
}
$p = new Produit("Clavier", 49.90);
echo $p; // PHP appelle __toString automatiquement : Clavier (49.9 €)
?>
💡 Conseil : implémente __toString() dans tes classes dès que tu débogues souvent avec var_dump ou echo. Tu obtiens un affichage contrôlé et lisible à la place d'un Object(Produit) opaque. C'est aussi la première chose que les loggers et les gestionnaires d'erreurs utilisent pour sérialiser un objet en message.
From theory to PHP syntax
In the course « OOP explained simply », you saw the ideas: an object groups properties (data) and methods (actions), and a class is the mold. Here, we translate all that into concrete PHP, and you run it directly.
A reassuring note: PHP's object syntax looks a lot like Java, C# or JavaScript. Learning it here means learning it almost everywhere.
Declaring a class
The class keyword, properties (typed, it's better) and methods. Inside, $this refers to the current object.
class Compte {
public string $titulaire; // a typed property
public float $solde = 0; // with a default value
public function deposer(float $montant): void {
$this->solde += $montant; // $this = THIS object
}
}
Note the -> (arrow): in PHP, you access an object's properties and methods with $object->property and $object->method(), not with a dot.
The constructor: __construct
The constructor is the special method __construct(), called automatically by new. That's where you initialize the object.
We declare class Compte { public $titulaire; public $solde; function __construct($titulaire) { $this->titulaire = $titulaire; $this->solde = 0; } }. Then we write $a = new Compte("Alice"); and $b = new Compte("Bob");. Before reading on: when is __construct called, what are the values of $a->solde and $b->solde right after those two new calls, and what does $this refer to inside the constructor?
See the answer
__construct is called automatically by new, once per created object: its role is to initialize the object at instantiation time. $a->solde and $b->solde are both 0, but they are two separate memory slots: $a and $b are independent objects, changing one does not affect the other. $this refers to the object currently being constructed: during the first new, $this is $a; during the second, $this is $b. That is what allows each object to initialize its own properties without interfering with its neighbors.
class Compte {
public string $titulaire;
public float $solde = 0;
public function __construct(string $titulaire) {
$this->titulaire = $titulaire;
}
}
$compte = new Compte("Alice"); // __construct is called here
echo $compte->titulaire; // Alice
PHP 8 shortcut: constructor property promotion. Instead of declaring the property then assigning it in the constructor, put the visibility directly in the parameters. These two versions are equivalent:
// Short version (PHP 8): declares AND assigns $titulaire at once
class Compte {
public float $solde = 0;
public function __construct(public string $titulaire) {}
}
Build objects (run it!)
A real PHP class running on the server. Each new Compte(...) creates an independent object, with its own balance. Edit the code, then click "Run".
<?php
class Compte {
public float $solde = 0;
public function __construct(public string $titulaire) {}
public function deposer(float $montant): void {
$this->solde += $montant;
}
public function resume(): string {
return "{$this->titulaire} : {$this->solde} €";
}
}
$alice = new Compte("Alice");
$alice->deposer(120);
$bob = new Compte("Bob"); // a distinct object, its own balance
echo $alice->resume() . "\n"; // Alice : 120 €
echo $bob->resume() . "\n"; // Bob : 0 €
?>
Key takeaways
- A class is declared with
class Name { ... }; you build objects withnew Name(...). - Properties carry a type (
float,string…) and, ideally, a visibility (we'll seepublic/privatenext lesson). $thisrefers to the current object; you access its members with->.- The constructor
__construct()initializes the object; promotion (PHP 8) shortens it.
Static properties and methods
So far, each object owns its own properties: $alice->solde and $bob->solde are separate memory slots. A static member works differently: it belongs to the class itself, not to any instance. It is shared by every object of that class, and accessible without creating an object.
You declare it with the static keyword, and reach it with the :: operator (scope resolution operator):
- From outside the class:
Compte::$compteur - From inside the class:
self::$compteur
Typical use cases: an instance counter (incremented in __construct to know how many objects have been created), or a utility / factory method that does not need an existing object to work.
<?php
class Compte {
public static int $compteur = 0; // class-level property, not per instance
public string $titulaire;
public function __construct(string $titulaire) {
$this->titulaire = $titulaire;
self::$compteur++; // increments the shared counter
}
public static function reinitialiser(): void {
self::$compteur = 0;
}
}
$a = new Compte("Alice");
$b = new Compte("Bob");
$c = new Compte("Charlie");
echo Compte::$compteur; // 3 (no instance needed to access it)
?>
📝 Note: a static member is unique across the entire class — there is only one $compteur, shared by every object. That is different from an instance property, where each object gets its own copy. Change Compte::$compteur and every object sees it, because there is only one.
Magic methods
PHP reserves a set of methods whose names start with __ (double underscore). You already know one: __construct. These are methods PHP calls automatically in certain situations — you never call them yourself.
The most useful ones to know:
__toString(): string— called when the object is used as a string (in anecho, a concatenation, asprintf…). Very handy for displaying an object in a readable way, in debugging or logging.__get($name)and__set($name, $value)— intercept reads and writes to an inaccessible or non-existent property. Useful for dynamic objects, automatic logging, or on-the-fly validation.
Others exist (__call, __invoke, __clone…), but the pattern is the same: PHP invokes them in a specific context. Use sparingly — explicit code stays more readable than "magic" behavior when both are possible.
<?php
class Produit {
public string $nom;
public float $prix;
public function __construct(string $nom, float $prix) {
$this->nom = $nom;
$this->prix = $prix;
}
public function __toString(): string {
return "{$this->nom} ({$this->prix} €)";
}
}
$p = new Produit("Clavier", 49.90);
echo $p; // PHP calls __toString automatically: Clavier (49.9 €)
?>
💡 Tip: implement __toString() in your classes whenever you frequently debug with var_dump or echo. You get a controlled, readable output instead of an opaque Object(Produit). It is also the first thing loggers and error handlers use to serialize an object into a message.
🎯 Pratique
S'entraîner (clique pour ouvrir) :
⚖️ Juge le code de l'IA
Tu demandes une classe Compte à l'IA. Ton rôle de relecteur : accepter ce code tel quel ou le rejeter, et dire pourquoi.
class Compte {
public string $titulaire;
public float $solde = 0;
public function deposer(float $montant): void {
$this->solde += $montant;
}
}
$c = new Compte();
$c->titulaire = "Alice";
$c->solde = 999999; // l'IA initialise le solde comme ça
$solde est public : n'importe qui peut écrire $c->solde = 999999 et casser l'invariant du compte (c'est exactement ce que la prochaine leçon ferme avec la visibilité). Ensuite il n'y a pas de __construct() : on fabrique un objet à moitié vide puis on remplit les propriétés à la main, ce qui autorise un Compte sans titulaire. Le réflexe pro : un constructeur qui exige le titulaire et un solde non modifiable directement de l'extérieur.🧠 Rappel libre
Sans remonter dans la leçon : à quoi sert new Compte("Alice"), et que désigne $this à l'intérieur d'une méthode ?
new Compte("Alice") fabrique un nouvel objet à partir de la classe (le moule) et appelle automatiquement son __construct("Alice") pour l'initialiser ; chaque appel crée un objet indépendant, avec ses propres propriétés. À l'intérieur d'une méthode, $this désigne l'objet courant, celui sur lequel la méthode a été appelée, et on accède à ses membres avec la flèche -> (ex. $this->solde).class Compte { public float $solde = 0; } puis $a = new Compte(); $b = new Compte(); $a->solde = 100;. Que vaut $b->solde ?Pour l'instant, $solde est public : n'importe qui peut écrire $compte->solde = 999999. La prochaine leçon ferme cette porte avec la visibilité.
Leçon 2 : Visibilité →