Quiero crear una clase estática en PHP y hacer que se comporte como lo hace en C #, así que
- Se llama automáticamente al constructor en la primera llamada a la clase
- No se requiere instanciación
Algo de este tipo ...
static class Hello {
private static $greeting = 'Hello';
private __construct() {
$greeting .= ' There!';
}
public static greet(){
echo $greeting;
}
}
Hello::greet(); // Hello There!
php
design-patterns
oop
static
aleemb
fuente
fuente
Respuestas:
Puede tener clases estáticas en PHP, pero no llaman al constructor automáticamente (si intenta llamar
self::__construct()
, obtendrá un error).Por lo tanto, tendría que crear una
initialize()
función y llamarla en cada método:fuente
Therefore you'd have to create an initialize() function and call it in each method:
eso, sería más fácil hacerinitialize
una función pública y llamarla inmediatamente después de la declaración de la clase.__callStatic
, allí podrás ver si se inicializó y luego hacerself::$method
o lo que sea que estés llamando. Si todavía está llamando al método directamente, intente cambiar todo a privado y vea allí.Además de la respuesta de Greg, recomendaría establecer el constructor privado para que sea imposible crear una instancia de la clase.
Entonces, en mi humilde opinión, este es un ejemplo más completo basado en el de Greg:
fuente
puedes tener esas clases "estáticas". pero supongo que falta algo realmente importante: en php no tienes un ciclo de aplicación, por lo que no obtendrás una estática real (o singleton) en toda tu aplicación ...
ver Singleton en PHP
fuente
la estructura de b se llama un controlador de singeton, también puede hacerlo en un
este es el uso singleton
$a = a::getA(...);
fuente
Generalmente prefiero escribir clases regulares no estáticas y usar una clase de fábrica para crear instancias individuales (sudo estáticas) del objeto.
De esta forma, el constructor y el destructor funcionan de manera normal, y puedo crear instancias no estáticas adicionales si lo deseo (por ejemplo, una segunda conexión de base de datos)
Lo uso todo el tiempo y es especialmente útil para crear controladores de sesión de almacenamiento de base de datos personalizados, ya que cuando la página termina, el destructor empujará la sesión a la base de datos.
Otra ventaja es que puede ignorar el orden en que llama a las cosas, ya que todo se configurará a pedido.
La clase DB ...
En cualquier lugar que desee usar, simplemente llame ...
Luego, trate todos los métodos como no estáticos (porque lo son)
fuente
el objeto no se puede definir estáticamente pero esto funciona
fuente