Manuel PHP
Précédent | Chapitre 19. Les classes et les objets (PHP 5) | Suivant

# Masques

Les masques sont un moyen de décrire les meilleures pratiques et les bonnes conceptions. Ils proposent une solution flexible aux problèmes habituels de programmation.

## Usine

Le masque d'usine permet l'instanciation d'objets durant l'exécution. Il est appelé "masque d'usine" puisqu'il est responsable de la "fabrication" d'un objet.

Exemple 19-24. Méthode d'usine
`<?php class Exemple { // La méthode d'usine public static function factory($type) { if (include_once 'Drivers/' . $type . '.php') { $classname = 'Driver_' . $type; return new $classname; } else { throw new Exception ('Driver non trouvé'); } } } ?>`
Définir cette méthode dans une classe permet de charger un pilote à la volée. Si la classe Example était une classe d'abstraction de base de données, le chargement des pilotes MySQL et SQLite pourrait être effectué comme ceci :
`<?php // Chargement du driver MySQL $mysql = Exemple::factory('MySQL'); // Chargement du driver SQLite $sqlite = Example::factory('SQLite'); ?>`

## Singleton

Le masque singleton est utilisé dans les situations où l'on a besoin qu'il n'y ait une unique instance d'une certaine classe. L'exemple le plus commun est une connexion à une base de données. L'implémentation de ce masque permet au développeur de rendre cette unique instance facilement accessible par beaucoup d'autres objets.

Exemple 19-25. Fonction Singleton
`<?php class Example { // instance de la classe private static $instance; // Un constructeur privé ; empêche la création directe d'objet private function __construct() { echo 'Je suis construit'; } // La méthode singleton public static function singleton() { if (!isset(self::$instance)) { $c = __CLASS__; self::$instance = new $c; } return self::$instance; } // Exemple d'une méthode public function bark() { echo 'Woof!'; } // Prévient les utilisateurs sur le clônage de l'instance public function __clone() { trigger_error('Le clônage n\'est pas autorisé.', E_USER_ERROR); } } ?>`
Ceci autorise une unique instance de la classe Example.
`<?php // Ceci échoue car le constructeur est privé $test = new Example; // Ceci récupère toujours une seule instance de la classe $test = Example::singleton(); $test->bark(); // Ceci provoque une erreur E_USER_ERROR. $test_clone = clone($test); ?>`

Précédent | Sommaire | Suivant
Parcours d'objets | Niveau supérieur | Méthodes magiques