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

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

यह ReflectionProperty वर्ग नहीं मिला गंभीर त्रुटि वापस आ जाएगी कहाँ $ गुण ReflectionProperty की वस्तु की सरणी है। यह वैश्विक अंतरिक्ष को स्वचालित रूप से क्यों हल नहीं करता है? जहां डीओएम से संबंधित वर्ग निश्चित रूप से ऐसा करता है। यदि ReflectionProperty कक्षा use डी नामस्थान में है तो यह काम करता है। लेकिन क्यों यह निश्चित रूप से खुश नहीं है?प्रतिबिंब

+0

कृपया अपने कोड, जैसे कि हम देख सकते हैं "ReflectionProperty वर्ग नहीं मिला गंभीर त्रुटि" के साथ अन्य समस्याओं को ठीक प्रयास करें; यदि आप। – salathe

+0

@salthe मुझे यकीन नहीं है कि आप किस समस्या का जिक्र कर रहे हैं। – varuog

+0

मुझे नहीं पता कि मेरा प्रश्न क्यों कम हो गया है। मेरे प्रश्न में क्या गलत है? – varuog

उत्तर

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

+0

क्या हम प्रति परियोजना 'नामस्थान' घोषित कर सकते हैं? मेरा मतलब है कि परियोजना में सभी फाइलों का नाम 'नेमस्पेस' होगा ... – Aviator

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'); होना चाहिए) नाम स्थान में