2013-11-14 6 views
8

ओवरराइट करने का कारण बनता है, इसलिए मैं आज एक फॉर्म बना रहा था और एक वैरिएबल का नाम फोरैच लूप में बाद में इस्तेमाल किए गए नाम के समान नाम देने के लिए हुआ था। मेरे आश्चर्य के लिए, फ़ोरैच लूप की घोषणा चर के पिछले घोषणापत्र को ओवरराइट करती है।बाहरी स्कोप के रूप में PHP में समान नाम PHP का नाम

मेरे लिए, यह 0 अजीब लगता है क्योंकि as $value => $a के दायरे को foreach लूप पर दो चर के दायरे को सीमित करने के लिए मुझे लगता है कि यह अजीब लगता है।

ऐसा ही होता है: अगर मैं foreach पाश की कुंजी के रूप में $a का उपयोग

php > $a = 5; //define a in outer scope 
php > $b = array(1,2,3); 
php > foreach($b as $value => $a){ echo $a; /* This $a should be the one from the foreach declaration */ }; 
123 
php > echo $a; //expecting inner scope to have gone away and left me to get the outer scoped $a 

एक ही बात होता है, और अधिक भयानक इस मणि था:

php > $a = 5; 
php > $b = array(1,2,3); 
php > foreach($b as $value => $a){ echo $a; }; 
123 
php > echo $a; 
3 

यह मेरी अपेक्षा है:

php > $a = 5; 
php > $b = array(1,2,3); 
php > foreach($b as $a => $b){ var_dump($b); } 
int(1) 
int(2) 
int(3) 
php > var_dump($b) // => int(3) 

जोको ओवरराइट करता है जगह में 0 सरणी, फिर भी इसके सदस्यों पर लूप किया गया है।

सब कुछ यह थोड़ा विचित्र लगता है। मेरा सवाल है, यह पूछ रहा है कि मुझे दस्तावेज/मैनुअल कहां मिलेगा जो निर्दिष्ट करता है कि इस व्यवहार की उम्मीद है?

+7

PHP का दायरा कार्य स्तर पर है। foreach() एक नया दायरा नहीं बनाता है। ऐसा कहा जा रहा है कि आपके दूसरे $ b => $ b संस्करण के मामले में एक अस्थायी "उपनाम" बनाया जाएगा। हालांकि, यह एक नए दायरे के निर्माण के मुकाबले PHP के आंतरिक लोगों का दुष्प्रभाव है। –

+0

लूप स्तर पर स्कॉइंग नहीं किया जाता है? – EdgeCaseBerg

+0

नहीं। Php में 2 scopes हैं। वैश्विक, और स्थानीय समारोह/विधि। –

उत्तर

1

केवल कार्यों के लिए एक नया गुंजाइश बनाने देखते हैं। घुंघराले ब्रेसिज़ द्वारा गठित ब्लॉक स्कोप एक नया नहीं बनाते हैं। आपके उदाहरण में आप वैश्विक दायरे में हैं।

संबंधित मुद्दे