2012-08-14 19 views
5

Estoy queriendo medir las opiniones de las personas sobre el uso de clases estáticas en lugar de espacios de nombres. Vengo de un fondo de C++ y soy muy aficionado a su sintaxis y cómo te permite estructurar el código. Recientemente decidí que necesitaba agrupar mi código en unidades lógicas en lugar de solo archivos. Por ejemplo, prefiero llamadas como User :: login to user_login. Entonces, hice un poco de googlear y me alivió descubrir que PHP tiene espacios de nombres. Mi alivio no duró mucho, realmente no me gusta la sintaxis; agrega más desorden a mis llamadas de función. Entonces, en este momento estoy usando clases estáticas para simular espacios de nombres. ¿Hay algún inconveniente en esto?PHP Static Class o Namespace

Encontré una pregunta similar en PHP Namespaces vs Classes with static functions pero no hubo mucha discusión.

Además, ¿hay una manera de evitar la siguiente situación:

class Test { 
public static void myFunc() { 
    Test::myOtherFunc(); 
} 
public static void myOtherFunc() { 

} 
} 

Supuse que estaría bien para llamar a funciones en la misma clase sin especificar el nombre, pero al parecer no. ¿Hay alguna solución para eso (por ejemplo, en C++ existe la palabra clave using)?

+0

'self ::' y '$ this->' se utilizan en PHP para llamar a sus propios métodos estáticos y de instancia, respectivamente. –

+0

Entonces, ¿no hay forma de que la calificación sea implícita? es decir, para verificar la clase actual de una función? – user1520427

+1

No, pero me parece explícito que es algo bueno :) –

Respuesta

5

Coincidentemente De hecho, he estado moviendo en la dirección exactamente opuesta:

  1. Use espacios de nombres para organizar clases de dominio (o funciones)
  2. uso de inyección de dependencias donde habría utilizado de otra forma clases estáticas

Lo que ocurre con las clases estáticas para simular espacios de nombres es que no se pueden organizar en varios archivos, todo debe definirse dentro de un archivo; esto bien puede estar a gusto personal.

La otra cosa sobre las clases estáticas es que comienzas sin ningún estado y poco a poco parte de la administración del estado se cuela y terminas con una extraña dependencia de lock-in. El estado debe reservarse para instancias. Actualmente, mi única clase estática notable es la configuración de todo el sitio.

Por último, la autorreferencia en las clases estáticas es explícita, mientras que en los espacios de nombres funciona exactamente como lo haría C++: especifica el nombre de la función y se busca primero dentro del espacio de nombres.

+0

Me gusta la idea de los espacios de nombres y cómo te permiten administrar el código, como dijiste, puedes organizarlos en varios archivos. Mi única queja real es la sintaxis torpe. No veo la necesidad de usar \ y eliminar la coherencia con otros idiomas. – user1520427

+0

@ user1520427 Sé cómo se siente, no es un gran espectador, pero piense en ello como una estructura de directorio y tiene sentido :) el autocargador predeterminado también lo usa de esa manera. –

4

Si mira desde el punto de vista de la estructura de código, no hay diferencia entre el método de clase estática y la función de espacio de nombres. Ambos terminan en un ámbito global. La única diferencia es que, con el método de clase estático, está intentando falsificar OOP.

Por lo tanto, es mejor usar funciones de espacio de nombres, si lo que realmente necesita son funciones independientes/de utilidad. Los espacios de nombres son para agrupar cosas (tanto funciones como clases).

En cuanto a usted User::login() ejemplo, sería una mala práctica. En su lugar, debe tener un objeto real, que sea capaz de contener el estado.

$mapper = new UserMapper; 
$user = new User; 
$user->setNickname($name); 

$mapper->fetch($user); 

if ($user->hasPassword($password)) 
{ 
    $user->setLastLogin(time()); 
} 
else 
{ 
    // log the access attempt 
    // set error state 
} 

$mapper->save($user); 

La conclusión es la siguiente: si está utilizando estructuras estáticas (funciones o métodos), no se OOP. Solo lo estás fingiendo. En su lugar, debe utilizar OOP real, con dependency injection.

Si su código usa métodos estáticos y variables por todas partes, provoca un acoplamiento fuerte entre clases, agregue global state y hace harder to maintain and test su código base. Y esto no es específico de PHP.