Padrões de Projeto em PHP: Singleton
Tags: php, webdev, programming
Published: 2022-03-30 01:25:28

Design Patterns, os padrões de projetos, são extremamente úteis e eficazes na escalabilidade, robustez e compreensão do código. Embora seja um nome que nos leve a pensar em complexidade, o principal intuito de um padrão de projeto é resolver um problema. Foram formulados pela tão estimada Gang of Four e são utilizados em larga escala. Pense neles como uma solução para situações onde você provavelmente reinventaria a roda se não os conhecesse.

O padrão de projeto que vou apresentar hoje é um padrão criacional (uma das três categoria de padrões de projeto): o Singleton

Tanto o conceito como a aplicabilidade do Singleton são simples. O Singleton preza que apenas uma instância seja retornada. Isso possui diversa aplicabilidades. Pense numa classe com funcionalidades genéricas que é utilizada em vários pontos de sua aplicação, mas que não possui um estado. Seria uma boa ideia utilizar um Singleton para essa classe, certo?

Vou explicar por etapas a construção dessa classe para objetos solitários.

Vamos voltar ao anime Naruto e fingir que o único Uchiha existente realmente é o Sasuke (embora saibamos que tenha mais Uchihas no mundo do que Almeidas). Logo só existe um Uchiha na face da terra.

```php
final class Uchiha {
}
```

Ao declarar a palavra-chave `final` no inicio da classe estamos dizendo que essa classe não pode ser herdada, isto é: não pode gerar classes filhas. É isso mesmo, vamos fingir que o Sasuke é estéril também (pobre Sasuke). 

Um dos modos efetivos de bloquear a instanciação de uma classe é impedir sua proliferação é não deixando que o metodo construtor seja invocado... e não, não adianta deixar de definir um construtor, a classe faz isso automaticamente. Uma técnica que podemos aplicar é utilizando o modificador de acesso `private` em oposição ao `public`, em nosso construtor:

```php
final class Uchiha {

    private function __construct()
    {
    }

}
```

Outra situação que precisamos impedir é a clonagem do nosso Uchiha (afinal só se clona Senjus no anime). A técnica é a mesma: impedir acesso externo ao método especial.

```php
final class Uchiha {

    private function __construct()
    {
    }

    private function __clone()
    {
    }

}
```

Um cenário mais atípico: existe um método especial no PHP chamado o `__wakeup`, ele permite a completa construção de objetos desserializados (o Google é seu amigo). Vamos prevenir essa arte de Orochimaru tornando também o método `__wakeup` privado

```php
final class Uchiha {

    private function __construct()
    {
    }

    private function __clone()
    {
    }

    private function __wakeup()
    {
    }

}
```

Por fim, vamos criar um método que permite retornar o nosso Uchiha.


```php
final class Uchiha {

    // Declaramos o atributo a ser retornado
    private static ?Uchiha $instance

    private function __construct()
    {
    }

    private function __clone()
    {
    }

    private function __wakeup()
    {
    }

    // Método para obter a instância
    public function getInstance()
    {
       // Garantimos que somente uma instância seja criada
       if (!isset(self::$instance)) {
           self::$instance = new static();
       }

       // Por fim retornamos a instância
       return self::$instance;
    }
}

// criamos nosso objeto Singleton
$sasuke = Uchiha::getInstance();
```

Por hoje é só pessoal.
Até a próxima! 😊