IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Introducció

Singleton és un patró de disseny que té com objectiu assegurar-se que només es pot crear una instància d'una classe (un únic objecte) i proporcionar un punt global d'accés.

Normalment cal:

  • Definir una propietat privada i estàtica per guardar la instància de l'objecte
  • El constructor se sol definir privat per tal que no és pugui utilitzar desde l'exterior. El constructor pot estar buit
  • Es crea un mètode public i estàtic tipus instance() o getInstance() per obtenir una instància de l'objecte

Exemples

Comptador Singleton

<?php 
class Singleton
{
   private static $instancia;
   private $contador;
   

   private function __construct()
   {
      echo "He creado un " . __CLASS__ . "\n";
      $this->contador =0;
   }

   public static function getInstance()
   {
      if (  !self::$instancia instanceof self)
      {
         self::$instancia = new self;
      }
      return self::$instancia;
   }
   
   public function incrementar()
   {
      return ++$this->contador;
   }
   
   public function disminuir()
   {
      return --$this->contador;
   }
}
?>

TODO

class SingletonClass {
    private static $instance;
    private function __construct() { }
    public function __clone() {
        trigger_error('Clone is not allowed.', E_USER_ERROR);
    }
    public static function init() {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }
        return self::$instance;
    }
    // other public, dynamic methods for singleton
}

$singleton = SingletonClass::init();
Track number of instances:
class CountMe {
    public static $instances = 0;
    public function __construct() {
        CountMe::$instances++;
    }
    public function __destruct() {
        CountMe::$instances--;
    }
}
$a = new CountMe();
$b = new CountMe();
echo CountMe::$instances; // outputs 2

Evitar que es pugui clonar un Singleton

// Evita que el objeto se pueda clonar
    public function __clone()
    {
        trigger_error('La clonación de este objeto no está permitida', E_USER_ERROR);
    }

Vegeu també

Enllaços externs