¿Cómo se podría crear una clase Singleton usando clases PHP5?
php
oop
design-patterns
singleton
Andrew Moore
fuente
fuente
Respuestas:
Usar:
$fact == $fact2;
Pero:
Lanza un error.
Consulte http://php.net/manual/en/language.variables.scope.php#language.variables.scope.static para comprender los ámbitos de variables estáticas y por qué la configuración
static $inst = null;
funciona.fuente
PHP 5.3 permite la creación de una clase Singleton heredable a través del enlace estático tardío:
Esto resuelve el problema, que antes de PHP 5.3 cualquier clase que extendiera un Singleton produciría una instancia de su clase padre en lugar de la suya.
Ahora puedes hacer:
Y $ foo será una instancia de Foobar en lugar de una instancia de Singleton.
fuente
"subclass should own its own static var. check this: echo get_class(Foobar::getInstance());echo get_class(Singleton::getInstance());"
.$instance
reside en Singleton, no en la subclase. Después de instanciar alguna subclase, getInstance () devolverá esa instancia para todas las subclases.Lamentablemente, la respuesta de Inwdr rompe cuando hay varias subclases.
Aquí hay una clase base Singleton heredable correcta.
Código de prueba:
fuente
La forma real y moderna de hacer un patrón Singleton es:
Así que ahora puedes usarlo como.
Como puede ver, esta realización es mucho más flexible.
fuente
instance
función$instance
debe sernull
nofalse
Probablemente debería agregar un método privado __clone () para no permitir la clonación de una instancia.
Si no incluye este método, es posible lo siguiente
ahora
$inst1
! ==$inst2
- ya no son la misma instancia.fuente
usar:
responer:
Si está utilizando PHP 5.4: el rasgo es una opción, por lo que no tiene que desperdiciar la jerarquía de herencia para tener el patrón Singleton
y también observe que si usa rasgos o extiende la clase Singleton , un extremo suelto era crear clases únicas de clases secundarias si no agrega la siguiente línea de código:
en la clase infantil
El resultado inesperado será:
fuente
Este código puede aplicarse a cualquier clase sin importar su nombre de clase.
fuente
Admite múltiples objetos con 1 línea por clase:
Este método impondrá singletons en cualquier clase que desee, todo lo que debe hacer es agregar 1 método a la clase que desea hacer un singleton y esto lo hará por usted.
Esto también almacena objetos en una clase "SingleTonBase" para que pueda depurar todos los objetos que ha utilizado en su sistema recurriendo a los
SingleTonBase
objetos.¡Cree un archivo llamado SingletonBase.php e inclúyalo en la raíz de su script!
El código es
Luego, para cualquier clase que desee hacer un singleton, simplemente agregue este pequeño método individual.
Aquí hay un pequeño ejemplo:
Y solo puede agregar esta función singleton en cualquier clase que tenga y solo creará 1 instancia por clase.
NOTA: Siempre debe hacer que la construcción __ sea privada para eliminar el uso de la nueva Clase (); instancias
fuente
fuente
Realmente no necesitas usar el patrón Singleton porque se considera un antipatrón. Básicamente, hay muchas razones para no implementar este patrón en absoluto. Lea esto para comenzar con: Las mejores prácticas en clases de singleton PHP .
Si, después de todo, todavía cree que necesita usar el patrón Singleton, podríamos escribir una clase que nos permita obtener la funcionalidad Singleton extendiendo nuestra clase abstracta SingletonClassVendor.
Esto es con lo que vine a resolver este problema.
Use ejemplo:
Solo para demostrar que funciona como se esperaba:
fuente
Toda esta complejidad ("enlace estático tardío" ... harumph) es, para mí, simplemente un signo del modelo de clase / objeto roto de PHP. Si los objetos de clase fueran objetos de primera clase (ver Python), entonces "$ _instance" sería una instancia de clase variable de : un miembro del objeto de clase, en oposición a un miembro / propiedad de sus instancias, y también en lugar de compartido por sus descendientes En el mundo Smalltalk, esta es la diferencia entre una "variable de clase" y una "variable de instancia de clase".
En PHP, me parece que debemos tomar en serio la guía de que los patrones son una guía para escribir código: quizás podríamos pensar en una plantilla Singleton, pero tratando de escribir código que herede de una clase "Singleton" real parece equivocado para PHP (aunque supuse que un alma emprendedora podría crear una palabra clave SVN adecuada).
Continuaré codificando cada singleton por separado, usando una plantilla compartida.
Tenga en cuenta que estoy absolutamente fuera de la discusión singletons-are-evil, la vida es demasiado corta.
fuente
Sé que esto probablemente causará una guerra de llamas innecesaria, pero puedo ver cómo es posible que desee más de una conexión de base de datos, por lo que reconocería que singleton podría no ser la mejor solución para eso ... sin embargo, hay otros usos del patrón singleton que encuentro extremadamente útiles.
Aquí hay un ejemplo: decidí rodar mi propio MVC y motor de plantillas porque quería algo realmente liviano. Sin embargo, los datos que quiero mostrar contienen muchos caracteres matemáticos especiales como ≥ y μ y lo que tiene ... Los datos se almacenan como el carácter UTF-8 real en mi base de datos en lugar de estar codificados previamente en HTML porque mi aplicación puede entregar otros formatos como PDF y CSV además de HTML. El lugar apropiado para formatear para HTML es dentro de la plantilla ("ver" si lo desea) que es responsable de representar esa sección de página (fragmento). Quiero convertirlos a sus entidades HTML apropiadas, pero la función get_html_translation_table () de PHP no es súper rápida. Tiene más sentido recuperar los datos una vez y almacenarlos como una matriz, de modo que estén disponibles para que todos los usen. Aquí' Una muestra que toqué para probar la velocidad. Presumiblemente, esto funcionaría independientemente de si los otros métodos que usa (después de obtener la instancia) eran estáticos o no.
Básicamente, vi resultados típicos como este:
Entonces, aunque ciertamente no soy un experto, no veo una forma más conveniente y confiable de reducir la sobrecarga de las llamadas lentas para algún tipo de datos, mientras lo hago súper simple (una sola línea de código para hacer lo que necesita). De acuerdo, mi ejemplo solo tiene un método útil y, por lo tanto, no es mejor que una función definida globalmente, pero tan pronto como tenga dos métodos, querrá agruparlos, ¿verdad? ¿Estoy fuera de lugar?
Además, prefiero los ejemplos que realmente HACEN algo, ya que a veces es difícil de visualizar cuando un ejemplo incluye declaraciones como "// haz algo útil aquí", que veo todo el tiempo cuando busco tutoriales.
De todos modos, me encantaría cualquier comentario o comentario sobre por qué usar un singleton para este tipo de cosas es perjudicial (o demasiado complicado).
fuente
Este artículo cubre un tema bastante extenso: http://www.phptherightway.com/pages/Design-Patterns.html#singleton
fuente
He escrito hace mucho tiempo pensado compartir aquí
fuente
Estoy de acuerdo con la primera respuesta, pero también declararía la clase como final para que no se pueda extender ya que extender un singleton viola el patrón de singleton. Además, la variable de instancia debe ser privada para que no se pueda acceder directamente. También haga que el método __clone sea privado para que no pueda clonar el objeto singleton.
A continuación se muestra un código de ejemplo.
Ejemplo de uso
Lo que esto le impide hacer (lo que violaría el patrón singleton ...
¡NO PUEDES HACER ESTO!
fuente
Esta debería ser la forma correcta de Singleton.
fuente
Me gustó el método @ jose-segura de usar rasgos, pero no me gustó la necesidad de definir una variable estática en las subclases. A continuación se muestra una solución que lo evita al almacenar en caché las instancias en una variable local estática del método de fábrica indexado por nombre de clase:
El uso es el mismo que @ jose-segura, solo que no es necesaria la variable estática en las subclases.
fuente
Clase de base de datos que comprueba si hay alguna instancia de base de datos existente, devolverá la instancia anterior.
Ref. Http://www.phptechi.com/php-singleton-design-patterns-example.html
fuente
Este es el ejemplo de crear singleton en la clase de base de datos
patrones de diseño 1) singleton
entonces puesto fuera es -
use solo una instancia única, no cree 3 instancias
fuente
Ejemplo rápido:
Espero ayuda.
fuente
Este es mi ejemplo que proporciona la capacidad de llamar como $ var = new Singleton () y también crea 3 variables para probar si crea un nuevo objeto:
fuente