ओवरराइट करने का कारण बनता है, इसलिए मैं आज एक फॉर्म बना रहा था और एक वैरिएबल का नाम फोरैच लूप में बाद में इस्तेमाल किए गए नाम के समान नाम देने के लिए हुआ था। मेरे आश्चर्य के लिए, फ़ोरैच लूप की घोषणा चर के पिछले घोषणापत्र को ओवरराइट करती है।बाहरी स्कोप के रूप में 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 सरणी, फिर भी इसके सदस्यों पर लूप किया गया है।
सब कुछ यह थोड़ा विचित्र लगता है। मेरा सवाल है, यह पूछ रहा है कि मुझे दस्तावेज/मैनुअल कहां मिलेगा जो निर्दिष्ट करता है कि इस व्यवहार की उम्मीद है?
PHP का दायरा कार्य स्तर पर है। foreach() एक नया दायरा नहीं बनाता है। ऐसा कहा जा रहा है कि आपके दूसरे $ b => $ b संस्करण के मामले में एक अस्थायी "उपनाम" बनाया जाएगा। हालांकि, यह एक नए दायरे के निर्माण के मुकाबले PHP के आंतरिक लोगों का दुष्प्रभाव है। –
लूप स्तर पर स्कॉइंग नहीं किया जाता है? – EdgeCaseBerg
नहीं। Php में 2 scopes हैं। वैश्विक, और स्थानीय समारोह/विधि। –