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

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

它将返回ReflectionPropertyclass not found 致命错误 $properties 是对象的数组ReflectionProperty。为什么它不自动解析到全局空间?其中与 DOM 相关的类是隐式执行的。如果ReflectionPropertyuse在命名空间中是 d 它可以工作。但为什么不隐含地发生呢?

4

2 回答 2

17

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

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

$reflect=new \ReflectionClass('\\foo\\a');
$properties=$reflect->getProperties(\ReflectionProperty::IS_PROTECTED);
于 2012-08-08T07:51:12.713 回答
1

相对类名(那些不以 开头的\\)总是首先针对当前命名空间解析,然后针对每个别名标识符(通过use)解析。这尤其意味着,如果您自己没有定义一个具体的命名空间,那么您就是在全局命名空间中,这意味着它\BarBar引用同一个类。但是,如果您在命名空间中Foo,它们会有所不同 ( \Bar <==> Bar == \Foo\Bar)。

您可以在手册中找到详细说明。在手册的“命名空间基础”部分,您可以找到这背后的想法:它就像一个文件系统。如果您在根目录下,cat /etc/passwd并且cat etc/passwd是相同的,但不是,如果您更改工作目录。

(旁边:应该是$reflect=new \ReflectionClass('\\foo\\a');, 或$reflect=new \ReflectionClass(__NAMESPACE__ . '\\a');

于 2012-08-08T07:44:09.740 回答