Padrões de Projeto em PHP: Singleton
Rubens dos Santos
Posted on March 30, 2022
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.
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:
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.
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
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.
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! 😊
Posted on March 30, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
November 28, 2024
November 28, 2024