2009-02-27 12 views
6

He escuchado que el último PHP tiene soporte para espacios de nombres. Sé que las variables definidas en el ámbito global tienen no espacio de nombres, entonces, ¿cómo se puede hacer una variable en un espacio de nombres diferente?¿Qué es un espacio de nombres y cómo se implementa en PHP?

¿Es solo una forma de categorizar variables/funciones?

Respuesta

24

Los espacios de nombres son un mecanismo de lenguaje de programación para organizar variables, funciones y clases. PHP 5.3 añade soporte para espacios de nombres, que voy a demostrar en el siguiente ejemplo:

Digamos que quisiera combinar dos proyectos que utilizan el mismo nombre de la clase usuario, pero tienen diferentes implementaciones de cada uno:

// Code for Project One (proj1.php) 
<?php 
    class User { 
    protected $userId; 
    public function getUserId() { 
     return $this->userId; 
    } 
    } 
    $user = new User; 
    echo $user->getUserId(); 
?> 

// Code for Project Two (proj2.php) 
<?php 
    class User { 
    public $user_id; 
    } 
    $user = new User; 
    echo $user->user_id; 
?> 

<?php 
    // Combine the two projects 
    require 'proj1.php'; 
    require 'proj2.php'; // Naming collision! 
    $myUser = new User; // Which class to use? 
?> 

Para las versiones de PHP inferiores a 5.3, que tendría que pasar por la molestia de cambiar el nombre de la clase para todas las instancias de la clase usuario utilizado por uno de los proyectos para evitar una colisión de nombres:

<?php 
    class ProjectOne_User { 
    // ... 
    } 
    $user = new ProjectOne_User; // Code in Project One has to be changed too 
?> 

Para las versiones de PHP mayor o igual a 5.3, puede utilizar espacios de nombres cuando se crea un proyecto, mediante la adición de una declaración de espacio de nombres:

<?php 
    // Code for Project One (proj1.php) 
    namespace ProjectOne; 
    class User { 
    // ... 
    } 
    $user = new User; 
?> 

<?php 
    // Combine the two projects 
    require 'proj1.php'; 

    use ProjectOne as One; // Declare namespace to use 

    require 'proj2.php' // No collision! 

    $user = new \One\User; // State which version of User class to use (using fully qualified namespace) 

    echo $user->user_id; // Use ProjectOne implementation 
?> 

para más información:

+0

muy bien ilustrado, con comentarios y código. +1 –

+0

de acuerdo. Muy bien hecho. Solo desearía que fueran con un delimitador diferente entre espacio de nombres y clase. :( –

+0

Con todo el delimitador de pinzamientos: funcionará perfectamente bien si solo utiliza cadenas de comillas simples que hago para cada cadena en php a excepción de nuevas líneas –

1

Los espacios de nombres se utilizan a menudo con bibliotecas, la capacidad de referenciar el código de la biblioteca con 1 solo namespace ayuda a no engullir otros que ya se están utilizando.

3

A namespace le permite organizar el código y le ofrece una manera de encapsular sus elementos.

Puede visualizar espacios de nombres ya que un sistema de archivos utiliza directorios para agrupar archivos relacionados.

Básicamente, los espacios de nombres le proporcionan una forma de agrupar clases, funciones y constantes relacionadas.

También ayudan a evitar colisiones de nombres entre las clases/funciones/constantes de PHP, y mejoran la legibilidad del código, evitando nombres de clase extra largos.

Ejemplo de declaración de espacio de nombres:

<?php 
namespace MyProject; 

const CONNECT_OK = 1; 
class Connection { /* ... */ } 
function connect() { /* ... */ } 

?> 
+0

Así que para un montón de funciones de cadena de ayuda, que debería sacarlos de funciones estáticas en una clase y hacer cuerdas espacio de nombres; function match() {} etc? – alex

3

espacios de nombres resuelve el problema de conflictos de nombres al importar clases y funciones de las bibliotecas.

Sin espacios de nombres, si incluye dos bibliotecas que definen una función/clase con el mismo nombre (es decir, dos bibliotecas que incluyen una clase llamada 'usuario'), fallará.

Sin soporte de espacio de nombres en PHP, la mayoría de las bibliotecas han llevado a prefijar sus nombres de funciones/clases con algo que probablemente sea único, en un intento de evitar colisiones de nombres. El problema es que esto crea funciones más largas o nombres de clase.

El ejemplo dado here es de la clase de excepción:

PEAR_Form_Loader_Validate_Table_Element_Validator_Exception. 

Puede importar de un largo espacio de nombres en su propio ámbito local como un alias a través del 'AS' palabra clave - un nombre que elija. Por lo tanto, aún puede tener un nombre de clase corto de su elección en su ámbito local.

Lo siguiente aplica un 'alias' llamado DbConnection a Zend :: DB :: Connection.

use Zend::DB::Connection as DbConnection 
Cuestiones relacionadas