Como alguém criaria uma classe Singleton usando classes PHP5?
php
oop
design-patterns
singleton
Andrew Moore
fonte
fonte
Respostas:
Usar:
$fact == $fact2;
Mas:
Lança um erro.
Consulte http://php.net/manual/en/language.variables.scope.php#language.variables.scope.static para entender os escopos de variáveis estáticas e por que a configuração
static $inst = null;
funciona.fonte
O PHP 5.3 permite a criação de uma classe Singleton herdável via ligação estática tardia:
Isso resolve o problema: antes do PHP 5.3, qualquer classe que estendesse um Singleton produziria uma instância de sua classe pai em vez da sua.
Agora você pode fazer:
E $ foo será uma instância do Foobar em vez de uma instância do Singleton.
fonte
"subclass should own its own static var. check this: echo get_class(Foobar::getInstance());echo get_class(Singleton::getInstance());"
.$instance
reside em Singleton, não na subclasse. Depois que alguma subclasse é instanciada, getInstance () retornará essa instância para todas as subclasses.Infelizmente, a resposta de Inwdr é interrompida quando existem várias subclasses.
Aqui está uma classe base Singleton herdável correta.
Código do teste:
fonte
A maneira real e moderna de fazer o padrão Singleton é:
Então agora você pode usá-lo como.
Como você vê, essa percepção é muito mais flexível.
fonte
instance
função não$instance
deve sernull
false
Você provavelmente deve adicionar um método __clone () privado para impedir a clonagem de uma instância.
Se você não incluir esse método, será possível o seguinte
now
$inst1
! ==$inst2
- eles não são mais a mesma instância.fonte
usar:
respose:
Se você estiver usando o PHP 5.4: trait é uma opção, para que você não precise desperdiçar a hierarquia de herança para ter o padrão Singleton
e observe também que, se você usa características ou estende o Singleton classe uma extremidade solta era criar um singleton de classes filho, se você não adicionar a seguinte linha de código:
na classe infantil
o resultado inesperado será:
fonte
Este código pode ser aplicado a qualquer classe sem se preocupar com o nome da classe.
fonte
Suporta vários objetos com 1 linha por classe:
Esse método aplicará singletons em qualquer classe que você desejar, basta adicionar 1 método à classe que você deseja criar um singleton e isso fará isso por você.
Isso também armazena objetos em uma classe "SingleTonBase" para que você possa depurar todos os objetos que você usou em seu sistema recorrendo novamente aos
SingleTonBase
objetos.Crie um arquivo chamado SingletonBase.php e inclua-o na raiz do seu script!
O código é
Então, para qualquer classe que você deseja criar um singleton, basta adicionar este pequeno método único.
Aqui está um pequeno exemplo:
E você pode simplesmente adicionar esta função singleton em qualquer classe que você possui e ela criará apenas 1 instância por classe.
NOTA: Você deve sempre tornar o __construct privado para eliminar o uso da nova Class (); instanciações.
fonte
fonte
Você realmente não precisa usar o padrão Singleton porque é considerado um antipadrão. Basicamente, existem muitas razões para não implementar esse padrão. Leia isto para começar: Prática recomendada em classes singleton PHP .
Se, afinal, você ainda acha que precisa usar o padrão Singleton, poderíamos escrever uma classe que nos permita obter a funcionalidade Singleton estendendo nossa classe abstrata SingletonClassVendor.
Foi com isso que eu vim para resolver esse problema.
Use exemplo:
Apenas para provar que funciona como esperado:
fonte
Toda essa complexidade ("ligação estática tardia" ... harumph) é, para mim, simplesmente um sinal do modelo de objeto / classe quebrado do PHP. Se os objetos de classe fossem objetos de primeira classe (consulte Python), "$ _instance" seria uma instância de classe variável de - um membro do objeto de classe, em oposição a um membro / propriedade de suas instâncias, e também em oposição a compartilhado por seus descendentes. No mundo do Smalltalk, essa é a diferença entre uma "variável de classe" e uma "variável de instância de classe".
No PHP, parece-me que precisamos levar a sério a orientação de que os padrões são um guia para escrever código - talvez pensemos em um modelo Singleton, mas tentando escrever código que herda de uma classe "Singleton" real parece mal orientado para o PHP (embora eu suponha que uma alma empreendedora possa criar uma palavra-chave SVN adequada).
Continuarei a codificar cada singleton separadamente, usando um modelo compartilhado.
Observe que eu estou absolutamente fora da discussão sobre singletons-are-evil, a vida é muito curta.
fonte
Sei que isso provavelmente causará uma guerra de chamas desnecessária, mas posso ver como você pode querer mais de uma conexão com o banco de dados, por isso admito que o singleton pode não ser a melhor solução para isso ... no entanto, existem outros usos do padrão singleton que considero extremamente úteis.
Aqui está um exemplo: eu decidi rodar meu próprio MVC e mecanismo de modelagem porque queria algo realmente leve. No entanto, os dados que eu quero exibir contêm muitos caracteres matemáticos especiais, como ≥ e μ, e o que você tem ... Os dados são armazenados como o caractere UTF-8 real no meu banco de dados, em vez de pré-codificado em HTML, porque meu aplicativo pode fornecer outros formatos, como PDF e CSV, além do HTML. O local apropriado para formatar para HTML está dentro do modelo ("visualização", se desejar), responsável por renderizar a seção da página (snippet). Eu quero convertê-los em suas entidades HTML apropriadas, mas a função get_html_translation_table () do PHP não é super rápida. Faz mais sentido recuperar os dados uma vez e armazenar como uma matriz, disponibilizando-os para uso de todos. Aqui' uma amostra bati juntos para testar a velocidade. Presumivelmente, isso funcionaria independentemente de os outros métodos que você usar (depois de obter a instância) serem estáticos ou não.
Basicamente, vi resultados típicos como este:
Portanto, embora eu certamente não seja especialista, não vejo uma maneira mais conveniente e confiável de reduzir a sobrecarga de chamadas lentas para algum tipo de dados, ao mesmo tempo em que é super simples (linha de código única para fazer o que você precisa). Meu exemplo tem apenas um método útil e, portanto, não é melhor do que uma função definida globalmente, mas assim que você tiver dois métodos, você desejará agrupá-los, certo? Estou longe da base?
Além disso, prefiro exemplos que realmente fazem alguma coisa, pois às vezes é difícil visualizar quando um exemplo inclui instruções como "// faça algo útil aqui", que vejo o tempo todo ao procurar por tutoriais.
De qualquer forma, eu adoraria comentários ou comentários sobre por que usar um singleton para esse tipo de coisa é prejudicial (ou excessivamente complicado).
fonte
Este artigo aborda o tópico amplamente: http://www.phptherightway.com/pages/Design-Patterns.html#singleton
fonte
Eu escrevi há muito tempo pensado para compartilhar aqui
fonte
Concordo com a primeira resposta, mas também declararia a classe como final, para que não possa ser estendida, pois estender um singleton viola o padrão de singleton. Além disso, a variável de instância deve ser privada para que não possa ser acessada diretamente. Também torne o método __clone privado, para que você não possa clonar o objeto singleton.
Abaixo está um código de exemplo.
Exemplo de uso
O que isso impede você de fazer (o que violaria o padrão singleton ..
VOCÊ NÃO PODE FAZER ISSO!
fonte
Esse deve ser o caminho certo de Singleton.
fonte
Eu gostei do método @ jose-segura de usar características, mas não gostei da necessidade de definir uma variável estática nas subclasses. Abaixo está uma solução que a evita armazenando em cache as instâncias em uma variável local estática no método de fábrica indexado pelo nome da classe:
O uso é o mesmo que @ jose-segura, apenas não é necessária a variável estática nas subclasses.
fonte
Classe de banco de dados que verifica se existe alguma instância de banco de dados existente, ela retornará a instância anterior.
Ref http://www.phptechi.com/php-singleton-design-patterns-example.html
fonte
Este é o exemplo de create singleton na classe Database
padrões de design 1) singleton
então colocar fora é -
use apenas uma instância única e não crie 3 instâncias
fonte
Exemplo rápido:
Espero ajuda.
fonte
Aqui está o meu exemplo que fornece a capacidade de chamar como $ var = new Singleton () e também criar 3 variáveis para testar se ele cria um novo objeto:
fonte