2012-02-24 14 views
5

Después de hacer algunas investigaciones sobre el espaciado de nombres en PHP, intento descubrir cuáles son los beneficios reales, aparte de agrupar elementos de la biblioteca y volver a utilizar el mismo nombre de clase.Ventajas del PHP Namespacing

Lo que no me gusta de los espacios de nombres son estas líneas adicionales en la parte superior del archivo que está llamando a las clases de 'use core \ whatever \ class', que no tiene que ver con el enfoque estándar .

Además, algo sobre lo que no pude encontrar información, ¿qué sucede en la situación en la que necesitamos usar dos clases con el mismo nombre, pero en las diferentes carpetas, que contienen el mismo nombre de método? Todavía tendríamos que llamar al espacio de nombres, pero ¿cómo descubriría el código qué método de qué clase debería usarse?

Acabo de comenzar con los espacios de nombres, así que disculpe si esta pregunta parece sonar muy básica.

También, cómo funciona con los métodos estáticos, cosas como la clase Helper por ejemplo, también tengo que indicar que necesito este espacio de nombres 'use core \ whatever \ Helper'?

+3

La respuesta es simple: para limitar o eliminar la ambigüedad, para dar una mejor estructura a su base de código. Piénselo como uno de los pasos lógicos para tener conceptos de OOP en PHP. –

+2

No necesita usar 'use'. Siempre puede llamar a las clases con su nombre completo como 'new \ core \ whatever \ class'. Sin embargo, perderá el mayor beneficio: legibilidad. con respecto a sus otras preguntas (especialmente los conflictos de nombres), lea http://php.net/language.namespaces – KingCrunch

+0

(1 de 2) Tengo la misma pregunta. Entiendo el beneficio de poder mantener clases separadas con nombres idénticos en diferentes espacios de nombres. Pero este es el único beneficio que veo y tiene un gran precio. Si debo escribir las declaraciones X USE al comienzo de un archivo de la clase Php para crear los diversos objetos que necesito, ¿cómo es esto diferente a usar las instrucciones X require? – andypotter

Respuesta

12

Si tiene un proyecto grande con muchas clases, eventualmente encontrará conflictos de nombres. Tiene un db/mysql/adapter.php y un http/curl/adapter.php. Para tratar esto sin espacios de nombres, debe dar a sus clases nombres únicos como Db_Mysql_Adapter y Http_Curl_Adapter, y cada vez que se refiera a estas clases, deberá usar su nombre completo.

espacios de nombres permiten asignar un nombre a sus clases y Db\Mysql\AdapterHttp\Curl\Adapter y hacer referencia a ellos simplemente por Adapter en su espacio de nombres local o Mysql\Adapter y Curl\Adapter, respectivamente, en otros espacios de nombres. Esto puede guardar mucho de mecanografía.

Simplemente navegue a través de la fuente de Zend Framework version 1 contra version 2 para ver la diferencia.

¿Qué sucede en la situación en la que necesitamos utilizar dos clases con el mismo nombre, pero en las diferentes carpetas, que contienen el mismo nombre de método? Todavía tendríamos que llamar al espacio de nombres, pero ¿cómo descubriría el código qué método de qué clase debería usarse?

Si estás en espacio de nombres Db\Mysql, Adapter::foo() se refiere a Db\Mysql\Adapter y \Http\Curl\Adapter::foo() se referirían a la otra. Puede también alias de la clase en la parte superior de su archivo, si no quieren que escribir el nombre completo todo el tiempo:

namespace Db\Mysql; 
use Http\Curl\Adapter as HAdapter; 

Adapter::foo(); // Mysql adapter 
HAdapter::foo(); // Http adapter, same as: 
\Http\Curl\Adapter::foo(); 
+0

Gracias deceze - esto realmente ayuda mucho. – user398341

1

Lo que no me gusta de espacios de nombres son estas líneas adicionales en la parte superior del archivo está llamando a las clases de 'use core \ whatever \ class', que no tiene que ver con el enfoque estándar.

Los espacios de nombres agrupan lógicamente las clases y evitan la contaminación del alcance global. También le impide crear una gran porción de código PHP, código que puede necesitar partes en otros lugares de su sitio. Esto hace que sea una razón más para colocarlo en otro archivo para que otra parte del sitio lo use. No repetir (DRY), utilizar en muchos lugares, ¡pero solo codificarlo una vez!

¿Qué sucede en la situación en la que necesitamos utilizar dos clases con el mismo nombre, pero en las diferentes carpetas, que contienen el mismo nombre de método? Todavía tendríamos que llamar al espacio de nombres, pero ¿cómo descubriría el código qué método de qué clase debería usarse?

El espaciado de nombres evita estos problemas, usando aliases. además, tener clases con el mismo nombre? a menos que sean del mismo nombre pero tengan un propósito diferente o una subcategoría diferente, como api.document.events y api.ajax.events. De lo contrario, es un mal diseño del programa.

0

Esta respuesta se centra en la respuesta de @deceze.

Su argumento es que tener dos clases con nombres diferentes es más complicado. ¿Lo es?

1.) Su código de ejemplo no funciona porque nunca incluyó los archivos. Por lo que debe tener este aspecto:

namespace Db\Mysql; 
use Http\Curl\Adapter as HAdapter; 

include('Db/Mysql/Adapter.php'); 
include('Http/Curl/Adapter.php'); 

Adapter::foo(); // Mysql adapter 
HAdapter::foo(); // Http adapter, same as: 
\Http\Curl\Adapter::foo(); 

2.) No puede incluir los archivos adapter.php siempre y no se agrega la definición de espacio de nombres a estos archivos, también:

<?php 
// this is Db/Mysql/Adapter.php 

namespace Db/Mysql; 

class Adapter { 
    static function foo() { 
    } 
} 

?> 

Y ahora la no variante -nameSpace:

include('db/mysql/adapter.php'); 
include('http/curl/adapter.php'); 

MysqlAdapter::foo(); // Mysql adapter 
CurlAdapter::foo(); // Http adapter 

Un adapter.php debería tener este aspecto:

<?php 
// this is Db/Mysql/Adapter.php 

class MysqlAdapter { 
    static function foo() { 
    } 
} 

?> 

Finalmente necesita editar tantos archivos como antes, agregando más código como antes. Entonces este no puede ser el argumento.

El único argumento que podría existir es que evite problemas con third party libraries en conflicto. Pero, ¿cuántos conflictos de nombres tenía en el pasado? ¿Y cuántas bibliotecas conoces que usan espacios de nombres para que no necesites editar todos los archivos?

El hecho es que no hay beneficio en el mundo real. Esto es algo adoptado del mundo C que agrega más confusión que beneficios en mi opinión.