2009-08-10 18 views
6

¿Cómo puedo "restablecer" un espacio de nombres al global? Dado el siguiente código:Restablecer un espacio de nombres en PHP?

namespace foo; 
include 'myfile.php'; 

myfile.php tratará ahora de cargar todas sus clases en el espacio de nombres foo, a pesar de que sus clases son en el espacio de nombres global. Ahora no sería gran cosa intercambiar el orden de esas líneas, pero ¿cómo lidiaría con que myfile.php tenga un autocargador? Tratará de cargar las clases en el espacio de nombres foo.

Respuesta

10

Los espacios de nombres funcionan en un por archivo base. Si miarchivophp no declara ningún espacio de nombre, entonces todo en él pertenecerá al espacio de nombre global, independientemente del espacio de nombre en el que se usó include.

En pocas palabras, namespace declaraciones solo se aplican a su propio archivo, no incluye.

+0

http://us2.php.net/manual/en/language.namespaces.basics.php Ejemplos en la página para ejemplos de esto. – koen

2

Quizás no entendí bien su pregunta; en ese caso, ¿podría darnos un ejemplo de lo que obtienes y de lo que esperarías?


¿Estás seguro de que intentará cargar las funciones de myfile.php en el espacio de nombres foo?

Teniendo en cuenta que tengo un archivo (temp-2.PHP) que tiene este aspecto:

<?php 
namespace foo; 

function my_function_this_file() { 
    var_dump(__FUNCTION__); 
} 
my_function_this_file(); 

include 'my_other_file.php'; 
my_function_the_other_file(); 

Y otro (my_other_file.php) que tiene este aspecto:

<?php 

function my_function_the_other_file() { 
    var_dump(__FUNCTION__); 
} 

Cuando llamo al primero desde mi navegador, obtengo esta salida:

string 'foo\my_function_this_file' (length=25) 

string 'my_function_the_other_file' (length=26) 

Esto parece indicar que la segunda función no está dentro de ningún espacio de nombres, excepto el global, que corresponde al hecho de que no está declarado en ningún espacio de nombres.

Si no recuerdo mal, la instrucción "espacio de nombres" solo es válida para el archivo en el que se usa, y no para los archivos incluidos.


La página Import names cannot conflict with classes defined in the same file del namespaces FAQ parece indicar que también.


Espero que esto ayude, y entendí bien la pregunta ...


EDIT: por cierto, cambiando el orden de las líneas que, como este:

<?php 
include 'my_other_file.php'; 
namespace foo; 

Wouldn' t trabajo: la instrucción "espacio de nombres" debe ser la primera del archivo: obtendrá un error fatal, si lo hace:

Fatal error: Namespace declaration statement has to be the very first statement in the script 
8

myfile.php debe declarar el espacio de nombres que quiere ser. Si desea asegurarse de que las cargas de myfile.php en el espacio de nombres global, creo que puede poner

namespace // empty namespace means global 
{ 
} 

alrededor del cuerpo de mi_archivo. php. Asegúrese de utilizar las llaves, o bien redefinirá el resto del archivo en el que se incluye myfile.php para que también esté en el espacio de nombres global.

+3

No necesita esa declaración vacía del espacio de nombres. * No * afectará a los archivos que lo incluyeron, ya que las declaraciones de 'espacio de nombres' solo se aplican a su propio archivo. –

0

Me gustaría hablar de esto con mis hallazgos. A partir de PHP no puede manejar excepciones en los métodos __toString, la solución es hacerlo usted mismo: algo en la línea de

public function __toString() 
{ 
    try { 
     return $this->draw(); 
    } catch (\Exception $e) { 
     die(\error::_getExceptionPage($e)); 
    } 
} 

Sin embargo lo que se hace muy raro, el espacio de nombres de la llamada a error::_getExceptionPage($e) se convierte en la misma que la clase en la cual __toString se definió, y no pude encontrar una forma de evitar eso, excepto el prefijo de todo en mi código de manejo de excepciones con \, es decir, cada llamada a cualquier clase en getExceptionPage debe convertirse en \someClass::staticMethod().

Lo mismo ocurre con los archivos incluidos, todo: todo el código desde que la excepción lanzada se incrusta en el espacio de nombres de la clase defectuosa. Probado con PHP 5.3.17

Cuestiones relacionadas