📘

La POO en PHP

Classes

Une classe est dĂ©clarĂ©e avec des attributs (ce qu’elle est) et des mĂ©thodes (ce qu’elle peut faire) ~ POJO.

Une classe est dans un fichier du mĂȘme nom, son nom commence par une majuscule.

On accĂšde Ă  un attribut ou une mĂ©thode d’instance avec $this-> et Ă  un attribut ou mĂ©thode de classe avec self:: ou static::.

⚠
Un attribut de classe est forcément statique : static. Une méthode qui accÚde à un attribut statique est statique.
BP : Pour un tableau en attributs, on n’initialise pas le tableau dans la liste des attributs mais dans le constructeur, c’est plus lisible (de mĂȘme pour les valeurs par dĂ©faut Ă©ventuelles).
BP : On initialise gĂ©nĂ©ralement les attributs de classe dans les listes des attributs (par exemple un compteur d’instances).
â„č
A partir de PHP8, on spécifie le type des attributs.

Principe d’encapsulation : on restreint la visibilitĂ© des attributs (private ou protected) et on passe par des getters/setters. On laisse les mĂ©thodes en public pour qu’elles soient accessibles et donc utilisables.

On définit un et un seul constructeur avec function __construct(), dans lequel on initialise les paramÚtres avec $this->param1 = $param1 ou via les getters/setters.

â„č
Il est possible de ne pas dĂ©clarer de constructeur, on peut quand mĂȘme crĂ©er une instance (on ne met pas les parenthĂšses) : $uneInstance = new ClasseSansConstructeur. BP : GĂ©nĂ©ralement, on crĂ©e nous-mĂȘme un constructeur.

On ne peut pas choisir le nom du constructeur, qui est une “mĂ©thode magique” (commence par un double underscore) qui est hĂ©ritĂ© de object et qu’on ne peut pas appeler directement. Il y a aussi __destruct(), __toString(), __call(), __get(), __set(), __isset()


Héritage

Une classe enfant hĂ©rite d’une classe parent avec extends.

Il faut inclure le fichier de la classe parent avec require_once.

Au sein du constructeur enfant, on appelle le constructeur parent avec parent::__construct(param); (ou directement le nom de la classe), puis on complùte avec les attributs additionnels de l’enfant.

Il est possible d’ajouter de nouvelles mĂ©thodes et d’en substituer. On appelle une mĂ©thode du parent avec parent::methode().

â„č
Si une classe en appelle une autre et que les fichiers sont au mĂȘme endroit, il n’est pas nĂ©cessaire de l’importer.

Classe abstraite

Une classe abstraite est dĂ©clarĂ©e avec abstract class et ne peut pas ĂȘtre instanciĂ©e, une classe doit forcĂ©ment en hĂ©riter.

Elle contient des méthodes abstraites : public abstract function uneMethodeAbstraite();, qui seront complétées selon les classes enfant en héritant.

Interface

Une interface est déclarée avec implements.

Elle ne contient que des mĂ©thodes abstraites : public abstract function uneMethodeAbstraite();, que l’on peut raccourcir function uneMethodeAbstraite();.

Il s’agit d’un “contrat entre une classe et une interface : quand une classe implĂ©mente une interface, elle est obligĂ©e de dĂ©finir toutes les mĂ©thodes qui sont dans l’interface”.

Exceptions

Les exceptions sont gérées avec des try...catch...finally.

try {
	// instructions a tester
} catch (Exception $e) {
	echo 'Une exception a été levée ! <br>';
	echo 'Numéro de l\'erreur :'.$e->getCode().'<br>';
	echo 'Message : '.$e->getMessage();
} finally {
	// instruction a faire dans tous les cas
}

(+) Notions supplémentaires

pas vues en cours, à compléter


Les espaces de nom ou namespace et les variables disponibles comme __NAMESPACE__, __CLASS__, __FUNCTION__.

La sérialisation, permet de transformer une valeur en une représentation linéaire sous forme de chaßne de caractÚres : serialize() et unserialize().

Le chargement automatique des classes avec spl_autoload_register('uneFonctionQuiInclude');.

Le clonage d’instance avec la mĂ©thode magique __clone().