Wzorzec singleton-a przez wiele osób uważany jest jako antywzorzec ponieważ bardzo często jest nadużywany i niektórym osobom zastępuje użycie zmiennych globalnych. Jednakże są sytuacje, w których warto użyć singletona. Na przykład gdy chcemy pobrać połączenie z bazą danych w ciele funkcji, a nie chcemy dodawać kolejnego argumentu do funkcji.

Przykład singletona dla bazy danych:

<?php

class Database
{
   private static $instance;

   public static function getInstance()
   {
        if(self::$instance == null) self::$instance = new Database();

         return self::$instance;
   }

   private function __construct Database(){
   //polacz z bazą tutaj

  }

}

Pierwszą rzeczą która powinna się rzucić w oczy jest prywatny konstruktor. W programowaniu prywatny konstruktor może być użyty tylko wewnątrz klasy, czyli tworzymy obiekt klasy w niej samej. Następnie zwróć uwagę na obiekt $instance oraz na metodę getInstance();

Obiekt $instance służy nam do przechowywania instancji klasy, natomiast metoda getInstance() w przypadku gdy nie ma instancji to tworzy ją, a jeżeli jest to ją zwraca. Słowo static gwarantuje nam to, że w czasie trwania programu/aplikacji będziemy mieli utworzoną wyłącznie jedną instancję klasy Database.

Przykład użycia:

<?php

  function pobierzDane()
  {
     $db = Database::getInstance();
     return $db->query('select * from `table`')->fetchAll();
  }
?>

Jak widać użycie wzorca Singleton w wielu wypadkach ułatwia programowanie w php. W kolejnym artykule opisze wzorzec Registry, który jest rozszerzeniem Singleton-a.