Créer une classe, instancier un objet, cloner un objet
Créer une classe : class, new, $this, self
Une classe représente un objet ayant des propriétés (les variables) et des fonctions (méthodes). En plus des variables, un objet peut avoir des constantes de classes.
Lorsqu’on est dans un objet, le mot-clé $this permet de faire référence à un l’objet courant et préalablement instancié afin d’utiliser ces propriétés et méthodes. Le mot-clé self permet d’utiliser des constantes et méthodes de l’objet.
// Créer une classe
class NomClass
{
// Constante de classe
const CONST_NAME = 1;
// Variable de classe
public string $var = null;
// Méthode
public function getVar(): ?string
{
return $this->var;
}
// Méthode
public function getConstNameValue(): int
{
return self::CONST_NAME;
}
}Instancier un objet : new
Pour utiliser une classe, on en créé une instance. On obtient alors dans une variable de type object une instance de cette classe. On utilise pour cela le mot-clé new.
$instance = new NomClass();
Cloner un objet
Lorsqu’on affecte à une variable une autre variable qui est une instance d’une classe, alors cette nouvelle variable représentera la même instance de l’objet. C’est un clone.
$objet_a = new NomClass(); // Faire : $objet_b = $objet_a; // Équivaut à faire : $objet_b = clone $objet_b;
Constructeurs et destructeurs
Constructeurs
Le constructeur est une méthode de la classe. Si une classe possède un constructeur, alors cette méthode sera automatiquement invoquée à chaque création d’une instance de l’objet. Cela permet par exemple d’initialiser des valeurs.
Cette méthode doit avoir le nom réservé __construct. Elle peut recevoir des arguments en paramètres si nécessaire.
Dans le cas où l’on instancie une classe qui en étend une autre (une classe fille donc), le constructeur parent n’est pas automatiquement appelé. Si c’est nécessaire, il faut l’invoquer manuellement via la syntaxe parent::__construct(). Le constructeur d’une classe fille peut avoir des paramètres différents du constructeur parent, à l’inverse des autres méthodes.
Destructeur
Le destructeur est une méthode de la classe. Si une classe possède un destructeur, alors cette méthode sera automatiquement invoquée dès qu’il n’y a plus de référence à l’objet, dès qu’il y a un exit() …
Cette méthode doit avoir le nom réservé __destruct().
Dans le cas où l’on instancie une classe qui en étend une autre (une classe fille donc), le destructeur parent n’est pas automatiquement appelé. Si c’est nécessaire, il faut l’invoquer manuellement via la syntaxe parent::__destruct()
Visibilité
Chaque propriété et méthode se voit définir sa visibilité. Pour les constantes, c’est possible à partir de PHP 7.1. Par défaut et si le mot-clé de la visibilité n’est pas indiqué, les éléments appliquent la visibilité public.
| Visibilité | Fonctionnement |
|---|---|
public | Visible de partout, même en dehors de la classe. |
protected | Visible uniquement dans la classe et dans les classes filles et mères. |
private | Visible uniquement dans la classe. |
Constantes de classes et propriétés
Constantes de classes
La visibilité par défaut d’une constante de classe est public. Depuis PHP 7.1 il est possible de définir la visibilité d’une constante de classe en précédent le mot-clé const par le mot-clé de la visibilité souhaité.
Propriétés
Les propriétés d’une classe (aussi appelée attributs / membres / champs) sont définies en utilisant un des mots-clés public, protectedou private, suivi du type (à partir de PHP 7.4), suivi du nom et éventuellement suivi du signe = accompagné de la valeur par défaut à l’instanciation.
Extension de classe : extends, parent
Il est possible de créer une classe qui en étend une autre. Il n’est pas possible qu’une classe étende plusieurs classes. La fille hérite alors des propriétés et méthodes de la classe mère.
Les propriétés et méthodes héritées peuvent être surchargées dans la classe fille en les redéclarant avec le même nom que dans la classe mère. Il peut toutefois être interdit d’appliquer une surcharge, si une méthode est déclarée final. Dans le cas d’une surcharge de méthode, la signature de la méthode (nombre et types des paramètres, valeur de retour) doit rester strictement identique. Excepté pour le constructeur qui peut différer.
Une classe fille peut peut accéder aux éléments de la classe mère grâce au mot-clé parent::.
Une classe peut en étendre une autre en ajoutant après son nom le mot-clé extends suivi du nom de la classe à étendre.
Classes et méthodes abstraites
Une classe contenant une méthode abstraite doit forcément être elle-même abstraite. Une classe abstraite ne peut pas être instanciée.
Une méthode abstraite ne contient pas de code, elle se contente de déclarer la signature de la méthode (visibilité, nom, paramètres, retour).
Lorsqu’une classe hérite d’une classe abstraite, elle doit obligatoirement redéfinir toutes les méthodes abstraites de celle-ci. Il est obligatoire de conserver la même visibilité (ou une visibilité moins restreinte pour passer de protected à public par exemple, mais pas à private), le même nombre de paramètre et le même type pour chacun d’eux, le même type de retour.
Une classe abstraite et une méthode abstraite sont précédée du mot-clé abstract.
abstract class ClasseAbstraite
{
abstract protected function getName($user);
}
class AutreClass extends ClasseAbstraite
{
protected function getName($user)
{
return $user->last_name . ' ' . $user->first_name;
}
}