Leçon 1/7 10 min

Classes et objets en PHP

Syntaxe PHP objet : class, propriétés typées, méthodes, constructeur et new. Code exécutable inclus.

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.

Prédisez avant de lire

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 avec new Nom(...).
  • Les propriétés portent un type (float, string…) et, idéalement, une visibilité (on verra public/private à la prochaine leçon).
  • $this dé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 un echo, une concaténation, un sprintf...). 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.

Predict before reading

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 with new Name(...).
  • Properties carry a type (float, string…) and, ideally, a visibility (we'll see public/private next lesson).
  • $this refers 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 an echo, a concatenation, a sprintf…). 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
Accepter ou rejeter 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
À corriger plutôt qu'accepter tel quel. Le code tourne, mais deux signaux gênent. D'abord $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
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).
En PHP, comment accède-t-on à une méthode d'un objet ?
À quoi sert __construct() ?
Dans une méthode PHP, à quoi sert $this ?
Considère ce code PHP : class Compte { public float $solde = 0; } puis $a = new Compte(); $b = new Compte(); $a->solde = 100;. Que vaut $b->solde ?
Prochaine étape

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é →

Une erreur dans cette leçon, un passage flou, une question ? Écrivez-moi : chaque retour améliore ce cours.

Besoin d'un développeur pour votre projet ?

Réponse sous 24h · Sans engagement