2012-08-24 33 views
5

Siempre me han dicho que tenga mucho cuidado al crear clases estáticas, ya que tienden a ser usadas en exceso por programadores menos expertos.¿Debería mi clase de sesión ser estática?

Actualmente estoy escribiendo una clase de sesión en PHP para realizar un seguimiento de un usuario en el sitio.

Una sesión parece que tendría sentido estar en una clase estática porque solo va a haber una, ¿verdad?

Yo solía trabajar en un CMS que tenía una fábrica que crea un objeto de sesión, pero después se almacena la instancia y cuando cada vez se solicitó una nueva sesión (MyFactory :: getSession()) se devolvería el anteriormente inicializa una. ¿Hay alguna ventaja en esto?

Gracias!

+1

no, 'MyFactory :: getSession()' no tiene mucho sentido, y sí, usando una clase estática estaría bien. – Ryan

+0

Creo que puedes hacer malabares con varias sesiones si así lo deseas. –

+0

¿Por qué querrías sesiones múltiples? – Undefined

Respuesta

4

No, las clases deberían nunca ser estáticas, si está haciendo programación orientada a objetos. Eso se aplica a las fábricas también. El patrón de método de fábrica estático (que mostró en el ejemplo) se considera una mala práctica porque infringe SRP.

Las variables estáticas son simplemente globales por nombre diferente y los métodos estáticos son función de espacio de nombres, donde el espacio de nombres parece ser de clase.

Si necesita varios objetos para usar la misma instancia de sesión, debe proporcionarlos todos. Ya sea directamente o usando una fábrica.

class ObjectFactory 
{ 

    protected $session; 

    public function __construct($session) 
    { 
     $this->session = $session; 
    } 

    public function create($name) 
    { 
     return new $name($this->session); 
    } 

} 

Usted pasa la instancia de esta fábrica a cualquier objeto, que necesitaría crear estructuras, que usan la sesión. Simplemente crea los objetos con esta fábrica y todos se inicializarán con la misma instancia de sesión.

En el ejemplo más simple que sólo puede pasar a la sesión a cada objeto de forma manual:

$session = new Session; 

$user = new User($session); 
$article = new Document($session); 

Ambos $user y $article casos ahora compartirán la misma instancia de la sesión.

Para obtener más información, ver los siguientes presentaciones:

Cuestiones relacionadas