2012-08-08 54 views
6
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

回答

10

類將被命名空間名稱和全球財產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

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');)在命名空間