命名空间中的反射php

问题描述:

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

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

它将返回ReflectionProperty未找到类致命错误其中$ properties是ReflectionProperty对象的数组。为什么它不能自动解析到全局空间? DOM相关类在那里隐式地做。如果ReflectionProperty类是名称空间中的use d,但它的工作原理尽管如此。但为什么不隐含它发生?命名空间中的反射php

+0

请解决其他问题与您的代码,这样,我们可以看到“ReflectionProperty类未找到致命错误”;如果你可以的话。 – salathe 2012-08-08 07:57:31

+0

@salthe我不确定你指的是什么问题。 – varuog 2012-08-08 08:08:00

+0

我不明白为什么我的问题得到了投票。我的问题出了什么问题? – varuog 2012-08-08 08:09:08

类将被命名空间名称和全球财产preceeded需要通过斜线preceeded(\)。 use manual 试试这个

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

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

谢谢,错过\ ReflectionProperty – varuog 2012-08-08 08:05:27

+0

我们可以为每个项目声明一个'namespace'吗?我的意思是项目中的所有文件都具有相同的'namespace' ... – Aviator 2015-12-10 09:46:38

相对类名称(不以\\开头的)始终首先针对当前名称空间,然后针对每个别名标识符(通过use)进行解析。这尤其意味着,如果你自己没有定义一个具体的名字空间,你就在全局范围内,这意味着,\BarBar引用同一个类。但是,如果您在名称空间Foo内,则它们不同(\Bar <==> Bar == \Foo\Bar)。

你可以找到一个detailed explanation in the manual。在手册的"namespace basics" section中,您可以找到背后的想法:它就像一个文件系统。如果您在根目录中,则更改工作目录时,cat /etc/passwdcat etc/passwd是相同的,但不是。

(旁:应该是$reflect=new \ReflectionClass('\\foo\\a');,或者$reflect=new \ReflectionClass(__NAMESPACE__ . '\\a');)在命名空间