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