Padrão Singleton com PHP
SINGLETON, O ANTI-PATTERN
Para muitos, o padrão Singleton é considerado um anti-
pattern por conta do seu uso em forma estática (chamando a
classe sem precisar instanciá-la) e, principalmente, pelo
acesso global à instância da classe. Os problemas de utilizar
classes estáticas são vários: não podemos trabalhar com
interfaces, nosso código fica com um acoplamento mais alto,
entre outros.
(quote do livro: Design pattern com PHP 7 - página 43.)
Dito isso, o singleton ainda é muito utilizado no mercado quando precisamos de uma instância unica.
Com esse controle, impedimos a criação descontralada de instancias de class. Este padrão é muito utilizado quando estamos lidando com classes/frameworks de logs.
<?php
namespace Singleton;
class LogsSingleton
{
/** @var self $singleton instância da classe de logs. */
protected static LogsSingleton $instancia;
/** os métodos construtor, clone e wake up precisam ser privados, para que a classe só seja criado via método getInstancia */
private function __construct()
{
}
private function __clone()
{
}
private function __wakeup()
{
}
public static function getInstancia() : self
{
// self => se refere a própria classe
// Se a instancia estiver vazia, nenhuma classe foi criada ainda
if (empty(self::$instancia))
{
self::$instancia = new self();
}
return self::$instancia;
}
/** function para gravar dados em um arquivo de texto, simulando log */
public function gravarLog(array $dados):void
{
$nomeArquivo = 'logs.txt';
$logsAnteriores = [];
if (filesize($nomeArquivo) > 0)
{
$conteudoArquivo = file_get_contents($nomeArquivo);
// com esse array vazio, impedimos erros casos o arquivo inicial esteja vazio
$logsAnteriores = json_decode($conteudoArquivo, true);
}
$logsAnteriores[] = $dados;
// escreve no arquivo
$arquivo = fopen($nomeArquivo, 'w');
fwrite($arquivo, json_encode($logsAnteriores));
fclose($arquivo);
}
}
$instanciaLogs = LogsSingleton::getInstancia();
print_r($instanciaLogs);
Criamos a propriedade $instancia de forma estática, já que ela será responsável por garantir o acesso único a instância da classe. os métodos mágicas __construct, __wakeup 및 __clone estão privados para impedir que sejam chamados e criem instâncias da classe.
클래스를 인스턴스화하는 데 사용할 수 있는 텐트는 getInstancia() 메서드를 사용하는 것이므로 치명적인 오류가 발생합니다.
테스트:
$instancia = LogsSingleton::getInstancia();
$instanciaNova = LogsSingleton::getInstancia();
if ($instancia === $instanciaNova)
{
echo "são iguais";
}
Reference
이 문제에 관하여(Padrão Singleton com PHP), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bbwithpointers/padrao-singleton-com-php-2m4a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)