2012-08-08 18 views
6
namespace foo; 
class a 
{ 
private $bar; 
public $baz; 
protected $alpha 
} 

$reflect=new \ReflectionClass('a'); 
$properties=$reflect->getProperties(ReflectionProperty::IS_PROTECTED); 

Volverá Fatal error ReflectionProperty clase que no se encuentra donde $ propiedades es variedad de objetos de ReflectionProperty. ¿Por qué no se resuelve en el espacio global automáticamente? donde como clase relacionada DOM hace eso implícitamente. si la clase ReflectionProperty es use d en el espacio de nombres funciona bien. pero ¿por qué no implícitamente sucede?Reflexión en php namespace

+0

favor corrija los otros problemas con su código, como "Error fatal clase ReflectionProperty no encontrado" que podemos ver el; si puedes. – salathe

+0

@salthe No estoy seguro del problema al que se refiere. – varuog

+0

No entiendo por qué mi pregunta es get down vote. ¿Qué está mal con mi pregunta? – varuog

Respuesta

10

clase de espacio de nombres será precedido por el nombre de espacio de nombres y la propiedad global tiene que ser precedido por una barra (\). use manual probar este

namespace foo; 
class a 
{ 
private $bar; 
public $baz; 
protected $alpha; 
} 

$reflect=new \ReflectionClass('\\foo\\a'); 
$properties=$reflect->getProperties(\ReflectionProperty::IS_PROTECTED); 
+0

gracias, se perdió \ ReflectionProperty – varuog

+0

¿Podemos declarar un 'namespace' por proyecto? Quiero decir que todos los archivos en el proyecto tendrán el mismo 'namespace' ... – Aviator

1

Los nombres de clase relativos (aquellos que no comienzan con \\) siempre se resuelven primero contra el espacio de nombres actual y luego contra cada identificador de alias (a través de use). Esto significa especialmente que si usted no define un espacio de nombre concreto usted mismo se encuentra dentro del global, lo que significa que \Bar y Bar se refieren a la misma clase. Pero si se encuentra dentro de un espacio de nombres Foo difieren (\Bar <==> Bar == \Foo\Bar).

Puede encontrar un detailed explanation in the manual. En el "namespace basics" section del manual puede encontrar la idea detrás de esto: es como un sistema de archivos. Si está en la raíz, cat /etc/passwd y cat etc/passwd son lo mismo, pero no, si cambia el directorio de trabajo.

(Al lado: Debe ser $reflect=new \ReflectionClass('\\foo\\a');, o $reflect=new \ReflectionClass(__NAMESPACE__ . '\\a');)