2012-08-08 5 views
6
namespace foo; 
class a 
{ 
private $bar; 
public $baz; 
protected $alpha 
} 

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

on powróci ReflectionProperty klasy nie znaleziono błąd krytyczny gdzie $ jest tablicą właściwości przedmiotu ReflectionProperty. Dlaczego nie rozwiązuje się automatycznie w przestrzeni globalnej? gdzie jako klasa związana z DOM wykonuje to niejawnie. jeśli klasa ReflectionProperty to use d w przestrzeni nazw działa to jednak. ale dlaczego nie w domyśle?Odbicie w przestrzeni nazw PHP

+0

Proszę rozwiązać inne problemy z kodem tak, że możemy zobaczyć „klasy ReflectionProperty nie znaleziono błąd krytyczny”; Jeśli możesz. – salathe

+0

@salthe Nie jestem pewien, do jakiego problemu się odnosisz. – varuog

+0

Nie rozumiem, dlaczego moje pytanie zostało odrzucone. co jest nie tak z moim pytaniem? – varuog

Odpowiedz

10

klasy w przestrzeni nazw zostaną poprzedzone nazwą przestrzeni nazw i właściwości globalnych musi być poprzedzone ukośnikiem (\). use manual Spróbuj

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

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

dzięki, brakowało \ ReflectionProperty – varuog

+0

Czy możemy zadeklarować jedną "przestrzeń nazw" na projekt? Chodzi mi o to, że wszystkie pliki w projekcie będą miały tę samą "przestrzeń nazw" ... – Aviator

1

Względne nazwy klas (te, które nie rozpoczynają się od \\) są zawsze rozstrzygane najpierw w bieżącym obszarze nazw, a następnie przed każdym identyfikatorem aliasy (za pośrednictwem use). Oznacza to w szczególności, że jeśli nie definiujesz konkretnej przestrzeni nazw, jesteś w zasięgu globalnym, co oznacza, że ​​\Bar i Bar odnosi się do tej samej klasy. Ale jeśli jesteś w przestrzeni nazw Foo różnią się one (\Bar <==> Bar == \Foo\Bar).

Można znaleźć detailed explanation in the manual. W książce "namespace basics" section podręcznika można znaleźć ideę: To jest jak system plików. Jeśli jesteś w katalogu głównym, cat /etc/passwd i cat etc/passwd są takie same, ale nie, jeśli zmienisz katalog pracy.

(Obok: Powinno być $reflect=new \ReflectionClass('\\foo\\a'); lub $reflect=new \ReflectionClass(__NAMESPACE__ . '\\a');)