¿Pros y contras de los espacios de nombres vs incluir / requerir en PHP?

20

Recientemente comencé a usar espacios de nombres en PHP. Cuando los vi por primera vez, pensé que su sintaxis era fea y que nunca los usaría. Sin embargo, creé un cargador automático (spl_autoload_register) que hace que nunca tenga que volver a escribir una declaración de inclusión / solicitud.

Me gustan los espacios de nombres, pero ¿hay algún beneficio objetivo sobre las declaraciones de incluir / requerir, o son exactamente el mismo método para lograr el mismo objetivo?

NobleUplift
fuente
1
Los espacios de nombres evitan colisiones con bibliotecas de terceros.
Reactgular
1
En este momento, el principal beneficio para mí con respecto a los espacios de nombres es la carga automática. Por ejemplo, utilizo en línea new \Vendor\Namespace\Class()sin una declaración require anteriormente en el método o clase.
NobleUplift
3
Muchas bibliotecas PHP usan carga automática sin espacios de nombres. PHP debe hacer que los espacios de nombres sean obligatorios.
Reactgular
Ningún argumento de mi parte. Me gustaría ver todos estos cambios enumerados aquí .
NobleUplift

Respuestas:

21

Los espacios de nombres no son solo para clases de carga automática. También evitan conflictos de nombres. De hecho, ese es su propósito principal.

Supongamos que tiene un proyecto que necesita una clase llamada User, para almacenar información sobre los usuarios de su aplicación, pero un complemento también usa una clase (diferente) nombrada Userpara almacenar información. Los espacios de nombres le permiten crear su clase dentro de un espacio de nombres (por ejemplo, MyApp) y dejar que el complemento use otro espacio de nombres (por ejemplo, CoolPlugin). El código dentro del MyAppespacio solo puede referirse a User(por ejemplo, new User();), y también puede codificar en el CoolPluginespacio; cada uno obtendrá el resultado esperado. Cuando necesite usar código de otro espacio de nombres, simplemente prefijelo. Por ejemplo, el código en el CoolPluginespacio puede acceder a la Userclase a MyApptravés denew \MyApp\User();

La alternativa es que cada clase necesita un nombre complejo en todas partes , como class MyApp_Usery class CoolPlugin_User. Los espacios de nombres le permiten simplificar las cosas la mayor parte del tiempo y evitar conflictos de nombres todo el tiempo.

Editar: Para responder a la pregunta, "¿Hay alguna diferencia de rendimiento entre los dos?"

No significativo, no. No lo he comparado, pero probablemente haya una diferencia en el nivel de nanosegundos. Dicho esto, sacrificar la calidad del código por ajustes de rendimiento súper pequeños no es una buena estrategia, por lo que debe usar espacios de nombres independientemente. Para puntos de referencia de tipos similares de problemas, consulte PHPbench.com y esta respuesta de StackOverflow .

Su código debe ser increíblemente estricto e increíblemente sensible al tiempo (piense en el comercio de alta frecuencia o la gestión de reacciones nucleares) antes de que deba preocuparse por la microoptimización en este tipo de contexto. Si realmente es tan urgente, probablemente debería estar codificando en o incluso , no en lenguajes interpretados como PHP.

elixenida
fuente
1
+1 Simplemente noto que cada proyecto comienza a parecer que no podría necesitar espacios de nombres, y luego crece fácilmente hasta el punto de que es ridículo piratear cosas para trabajar sin ellas. No tener espacios de nombres es básicamente lo mismo que declarar cada variable global, como se aplica a las clases. En bases de código más grandes o que hacen un uso liberal de las bibliotecas, se convierte en un desastre total.
BrianH
1
Por favor vea mi edición arriba.
elixenide
2
¿Mencioné que estoy haciendo una interfaz PHP para el Gran Colisionador de Hadrones? De lo contrario, creo que esta respuesta es suficiente, gracias.
NobleUplift
1
¡No crees ninguna estrella de quark ni agujeros negros! Encantado de ayudar.
elixenide
1
No te preocupes, solo extraños. Estamos creando cañones de hadrones, quiero decir, algo científico y no armamento.
NobleUplift