Menu

Classes et objets PHP : propriétés, méthodes et $this

Une classe PHP est un plan déclaré avec class Name { }, et new Name() crée un objet à partir de lui. Propriétés, méthodes, $this, public/private/protected, propriétés typées et readonly, __toString, et pourquoi affecter un objet ne le copie pas.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Une classe PHP se déclare avec class Name { ... } et contient des propriétés (des variables) et des méthodes (des fonctions). new Name() crée un objet à partir d'elle, et -> lit une propriété ou appelle une méthode : $user->name, $user->greet().

La classe est le plan, l'objet est une chose construite à partir de lui. Vous pouvez créer autant d'objets que nécessaire à partir d'une classe, et chacun a ses propres valeurs de propriétés.

Propriétés et méthodes

Une propriété se déclare avec un mot-clé de visibilité, un type facultatif et une valeur par défaut facultative. Une méthode est une fonction dans la classe. Dans une méthode, $this est l'objet sur lequel la méthode a été appelée, donc $this->balance lit le solde de cet objet.

Chaque objet garde son propre $balance : déposer sur $a ne touche pas $b. Définir les propriétés une par une après new devient vite fastidieux ; un constructeur prend plutôt les valeurs de départ en arguments.

public, private et protected

La visibilité contrôle qui peut toucher une propriété ou appeler une méthode :

Mot-cléAccessible depuis
publicpartout
protectedla classe elle-même et les classes qui l'étendent
privateseulement la classe qui la déclare

Rendre une propriété private et exposer des méthodes, c'est ainsi qu'une classe protège ses propres règles. Ici, le solde ne peut changer que par deposit() et withdraw(), qui refusent les montants invalides :

Lire la propriété privée depuis l'extérieur de la classe n'est pas un warning, c'est une Error :

Propriétés typées et valeurs non initialisées

Une propriété typée sans valeur par défaut commence non initialisée, ce qui est différent de null. La lire avant qu'une valeur soit affectée lève une Error. Donnez-lui une valeur par défaut, affectez-la dans le constructeur, ou rendez-la nullable avec ?Type et = null.

Les types sont vérifiés à l'affectation. En mode par défaut (non strict), $p->stock = '7' convertit la chaîne numérique en 7, alors que $p->stock = 'many' lève une TypeError.

Propriétés readonly

Une propriété readonly (PHP 8.1) peut être écrite une fois, depuis l'intérieur de la classe, puis plus jamais. C'est la façon habituelle de construire des objets valeur comme des montants ou des identifiants. PHP 8.2 a ajouté readonly class, qui rend toutes les propriétés readonly.

Une propriété readonly doit avoir un type et ne peut pas avoir de valeur par défaut. S'il vous faut une copie modifiée, créez un nouvel objet (new Order('B-2002')) au lieu de modifier l'ancien.

Afficher un objet avec __toString

echo $object ne fonctionne que si la classe définit __toString(). La méthode renvoie la chaîne que PHP doit utiliser chaque fois que l'objet est traité comme du texte : dans echo, dans une concaténation, dans "{$object}".

Sans __toString, echo $object lève une Error (« Object of class Money could not be converted to string »). Pour déboguer, print_r() et var_dump() fonctionnent sur n'importe quel objet et montrent aussi les propriétés privées ; voir var_dump et print_r.

Affecter un objet ne le copie pas

C'est l'erreur qui piège le plus ceux qui viennent des tableaux. Affecter un tableau le copie. Affecter un objet ne copie que la poignée : les deux variables désignent alors le même objet.

clone fait une copie superficielle : si une propriété contient un autre objet, les deux copies partagent toujours cet objet intérieur. === n'est vrai que pour le même objet, alors que == compare les valeurs des propriétés de deux objets de la même classe. Passer un objet à une fonction fonctionne comme une affectation, donc une fonction peut modifier l'objet qu'elle reçoit.

Questions fréquentes

Comment créer un objet à partir d'une classe en PHP ?

Utilisez new avec le nom de la classe : $user = new User();. Si la classe a un constructeur, passez ses arguments entre les parenthèses, comme dans new User('Ada'). Vous appelez ensuite des méthodes et lisez des propriétés avec l'opérateur flèche : $user->name, $user->greet().

Que signifie $this en PHP ?

$this est l'objet sur lequel la méthode courante a été appelée. Dans $ada->greet(), $this est $ada, donc $this->name lit le nom d'Ada. Il n'existe que dans les méthodes non statiques.

Quelle est la différence entre public, private et protected en PHP ?

Les membres public sont utilisables de partout, les membres private seulement depuis la classe qui les déclare, et les membres protected depuis cette classe et ses classes enfants. Lire une propriété privée depuis l'extérieur lève une Error : Cannot access private property.

Les objets sont-ils passés par référence en PHP ?

Une variable contient une poignée vers l'objet, pas l'objet lui-même. $b = $a; copie la poignée, donc les deux variables désignent le même objet et une modification via $b se voit dans $a. Utilisez $b = clone $a; pour obtenir une copie indépendante.

Qu'est-ce qu'une propriété readonly en PHP ?

Une propriété déclarée public readonly string $id; (PHP 8.1+) peut être définie une fois, depuis l'intérieur de la classe, puis plus jamais modifiée. Y écrire une seconde fois lève une Error : Cannot modify readonly property.

Illustration des langages de programmation de Coddy

Apprendre à coder avec Coddy

COMMENCER