命名空间php中的反射

时间:2012-08-08 07:35:24

标签: php reflection namespaces

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,则它可以工作。但为什么不隐含地发生呢?

2 个答案:

答案 0 :(得分:14)

命名空间中的类将以命名空间名称开头,全局属性需要以斜杠(\)开头。 use manual 试试这个

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

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

答案 1 :(得分:1)

相对类名(不以\\开头)总是首先针对当前名称空间解析,然后针对每个别名标识符(通过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');