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
,则它可以工作。但为什么不隐含地发生呢?
答案 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
)解析。这尤其意味着,如果您没有自己定义具体的命名空间,那么您就属于全局命名空间,这意味着\Bar
和Bar
指的是同一个类。但如果你在一个名字空间Foo
内,它们就不同了(\Bar <==> Bar == \Foo\Bar
)。
您可以找到detailed explanation in the manual。在本手册的"namespace basics" section中,您可以找到背后的想法:它就像一个文件系统。如果您位于根目录中,cat /etc/passwd
和cat etc/passwd
相同,但不是,如果您更改了工作目录。
(旁边:应该是$reflect=new \ReflectionClass('\\foo\\a');
或$reflect=new \ReflectionClass(__NAMESPACE__ . '\\a');
)