2011-04-21 16 views
5

इस बारे में एक और सवाल है कि क्यों 'कैसे करें', फिर भी यह कुछ दिनों से मुझे परेशान कर रहा है। वर्तमान में मैं कोडइग्निटर के साथ कुछ काम कर रहा हूं और रूबी से अस्थायी रूप से PHP पर वापस जा रहा हूं, मुझे निम्न स्कोपिंग जादू के बारे में बताता है।PHP, एक विषम चरणीय दायरा?

<?php $query = $this->db->get('articles', 2); 
     if ($query->num_rows() > 0) 
     { 
      foreach ($query->result_array() as $row) 
      { 
       $data[] = $row; # <-- first appearance here 
      } 
     return $data; # <--- :S what?! 
     } 

आप देख सकते हैं, मैं नहीं बिल्कुल एक PHP गुरु, फिर भी स्थानीय गुंजाइश कीड़े मुझे का विचार है कि foreach पाश के बाहर चर 'उपलब्ध' है हूँ। तो मैं इस एक दृश्य के अंदर बाहर करने की कोशिश की:

<?php 

    if($a==1) 
    { 
    $b = 2; 
    } 
    echo $b; 
?> 

कौन सा एक त्रुटि संदेश में परिणाम:

Message: Undefined variable: b 

पीएचपी मैनुअल स्थानीय scoping के बारे में बताता है, फिर भी मैं अभी भी सोच रहा हूँ कि ऐसा क्यों होता है और अगर वहाँ ऐसे विशेष नियम हैं जिन्हें मैं नहीं जानता हूं। और यह मुझे डराता :)

विचार साझा करने के लिए धन्यवाद,

+2

आप अपने दूसरे उदाहरण में वैरिएबल बनाते हैं, केवल $ 1 है 1. चूंकि $ कोई मौजूद नहीं है (PHP वास्तव में यहां एक त्रुटि उठाता है), $ b नहीं बनाया जाएगा। पहले उदाहरण में, सभी शर्तों को पूरा कर लिया गया है ताकि $ डेटा बनाया जा सके और वापसी मूल्य के रूप में उपयोग किया जा सके। –

+0

दूसरा उदाहरण अधिक स्पष्टीकरण/oversimplification है कि घुंघराले ब्रेसिज़ के बाहर $ बी सुलभ है - जैसा कि अन्य उत्तरों बताते हैं, घुंघराले ब्रेसिज़ चर के दायरे को परिभाषित नहीं करते हैं। और वह, मुझे नहीं पता था :) – Shyam

+0

मुझे लगता है कि यह पुराना है, या शायद कठोरता का मामला। आपका दूसरा उदाहरण मेरे लिए और प्रिंट 2 के लिए काम करता है। मैं 5.4.16 के साथ काम कर रहा हूं STRICT – Dennis

उत्तर

11

केवल फ़ंक्शंस एक नया स्थानीय दायरा बनाते हैं। खुद से घुंघराले ब्रेसिज़ नहीं करते हैं। घुंघराले ब्रेसिज़ अन्य भाषा संरचनाओं (if, while या foreach) के लिए केवल सहायक निर्माण हैं।

और जब आप स्थानीय क्षेत्र में किसी भी चर का उपयोग करते हैं तो इससे कोई फर्क नहीं पड़ता। दृश्यों के पीछे स्थानीय क्षेत्र निहित शब्दकोश है (get_defined_vars देखें)। आपको पहले अपरिभाषित चरों तक पहुंच से डीबग नोटिस मिल सकता है, लेकिन यह इसके बारे में है।

आपके विशिष्ट उदाहरण में ऐसा लगता है कि आप वैश्विक स्तर पर भी काम कर रहे हैं।

+1

वह पहला वाक्य इसे क्रिस्टल स्पष्ट समझता है! धन्यवाद! – Shyam

+0

कूल। इसके लिए एक औपचारिक भाषा अर्थशास्त्र शब्द भी है, लेकिन मुझे याद नहीं है। :/ – mario

+0

@ मारियो, [उद्धरण वांछित] (http://xkcd.com/285) "* घुंघराले ब्रेसिज़ केवल अन्य ** संरचनाओं के लिए ** ** सहायक निर्माण ** हैं ...." .... – Pacerier

7

foreach PHP में किसी भी चर गुंजाइश तो यह स्वाभाविक है यदि चर बाहर foreach

दूसरे प्रश्न के लिए उपलब्ध है नहीं बना है $a नहीं है 1 के बराबर $b प्रारंभ नहीं किया गया है और जब आप बाहर पहुंचते हैं तो नोटिस फेंक देते हैं। यदि आप मान 1 से $a पर असाइन करते हैं और इसका परीक्षण करते हैं तो आपको आश्चर्य होगा कि नोटिस चलेगी।

यहां दायरे की तरह कुछ भी नहीं है।

+0

दूसरा उदाहरण कोई प्रश्न नहीं है, और अधिक एक परिप्रेक्ष्य के रूप में मैं व्यवहार की उम्मीद करेंगे (PHP भाषा के साथ मेरा अनुभवहीनता)। जैसा कि अन्य उत्तरों बताते हैं, कि घुंघराले ब्रेसिज़ चरणीय दायरे को परिभाषित नहीं करते हैं। हालांकि, आपके उत्तर के लिए धन्यवाद :) – Shyam

+0

@ श्याम: कोई समस्या नहीं, जैसा कि मैंने अभी इस –

1

श्याम, आप एक स्क्रिप्टिंग भाषा का उपयोग कर रहे हैं, सी ++ नहीं। यह PHP या जावास्क्रिप्ट जैसी स्क्रिप्टिंग भाषाओं के लिए विशिष्ट है, प्रत्येक कोड ब्लॉक के लिए अलग-अलग स्कोप नहीं हैं। इसके बजाय पूरे समारोह के लिए एक गुंजाइश है। यदि आप अपना पहला उदाहरण मानते हैं तो यह वास्तव में काफी आसान है, लेकिन आपको स्पष्ट रूप से सावधान रहने की आवश्यकता है क्योंकि आपके दूसरे में देखा जा सकता है।

+1

को समझाने की कोशिश की है, यह पीएल के लिए स्कोपिंग तंत्र (बदसूरत 'call_user_func (function() {}) के अलावा) के लिए अच्छा डिजाइन है। यह क्यों है "स्क्रिप्टिंग भाषाओं के लिए विशिष्ट है कि प्रत्येक कोड ब्लॉक के लिए अलग-अलग स्कोप न हों"? – Pacerier

1

$ 1 के बराबर है? यदि $ बी = 2 का मूल्यांकन कभी नहीं किया जाएगा!

3

देखें: http://php.net/manual/en/language.variables.scope.php

php घुंघराले ब्रेसिज़ में जरूरी चर के लिए एक नया क्षेत्र को परिभाषित नहीं है। (आपका पहला उदाहरण)

आपके दूसरे उदाहरण में, $ बी केवल एक विशिष्ट स्थिति पर सेट है। इसलिए यदि यह स्थिति पूरी नहीं हुई है तो 'अनिर्धारित' होना संभव है।

+0

लिंक और आपके उत्तर के लिए धन्यवाद! – Shyam

1

वास्तव में आपकी पहली विधि आपको भी एक त्रुटि देनी चाहिए।

आप एक चर का उपयोग कर रहे हैं जिसे एक सरणी के रूप में घोषित नहीं किया गया है। मैं समझ नहीं पा रहा हूं कि आपको इसके लिए कोई त्रुटि क्यों नहीं मिली।

PHP में ब्लॉक स्कोप नहीं है, तो क्या यह अंदर है या फोरच अप्रासंगिक है। यदि यह विधि के अंदर उपलब्ध है, तो आप इसे विधि के अंदर उपयोग कर सकते हैं।

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