fev 11
13
Singleton
“Singleton, é um padrão de projeto de software (do inglês Design Pattern). Este padrão garante a existência de apenas uma instância de uma classe, mantendo um ponto global de acesso ao seu objeto.”
fonte: Wikipédia
Agora que já sabemos do que se trata Singleton, vou ensinar uma forma prática de fazer em php.
class minhaSingleton
{
static protected $Singleton;
public $teste = 'teste'; // para efeito de testes/exemplos
/* previne instanciar deliberadamente */
protected function __construct() { /* seu construtor */ }
/* previne clonar o objeto gerando novas instâncias */
public function __clone()
{
throw new Exception("Não é possível clonar o objeto.");
return null;
}
/* adquire a instância caso exista ou a cria */
static public function &Instance()
{
if ( ! self::$Singleton instanceof self )
{
self::$Singleton = new self;
}
return self::$Singleton;
}
}
/* exemplos... */
$Instancia1 = minhaSingleton::Instance();
$Instancia2 = minhaSingleton::Instance();
$Instancia1->teste = 'variavel';
echo $Instancia2->teste; // imprime: variavel
$Instancia3 = new minhaSingleton(); // erro fatal!
/* NOTA: $Instancia1 ===$Instancia2 é verdadeiro */
Acontece que quando declaro $Instanca1 e $Instancia2 elas recebem uma referência a minhaSingleton::$Singleton, que por sua vez não pode ser acessada de fora do escopo da classe. Caso $Singleton não seja um objeto instanciado da própria classe ele instancia e retorna a referência.
Quando atribuo “variavel” para $Instancia1->teste, na realidade, foi atribuido para minhaSingleton::$Singleton->teste, e quando mando imprimir $Instancia2->teste ele busca em minhaSingleton::$Singleton->teste, o que dá o retorno esperado.
Quanto tento instanciar $Instancia3 pelos métodos convencionais eu recebo um erro fatal, pois como o construtor (__construct()) é protegido, o mesmo não pode ser acessado de fora do escopo da classe.
Basicamente é isso. O link da wikipédia tem alguns outros detalhes para melhor entendimento do que se trata o singleton.