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

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

クラスが見つからないという致命的なエラーが返されReflectionPropertyます $properties は のオブジェクトの配列ですReflectionProperty。グローバル空間に自動的に解決されないのはなぜですか? DOM関連のクラスは暗黙的にそれを行います。ReflectionPropertyclass がuse名前空間で 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/passwdcat etc/passwd同じですが、作業ディレクトリを変更した場合は異なります。

(横: $reflect=new \ReflectionClass('\\foo\\a');、またはである必要があります$reflect=new \ReflectionClass(__NAMESPACE__ . '\\a');)

于 2012-08-08T07:44:09.740 に答える