2010-05-24 10 views
33

निम्नलिखित PHP कोड 3 आउटपुट करेगा।PHP और सी के बीच परिवर्तनीय दायरा अंतर: ब्लॉक स्कोप बिल्कुल वही नहीं है?

function main() { 
    if (1) { 
     $i = 3; 
    } 
    echo $i; 
} 

main(); 

लेकिन निम्न सी कोड संकलन त्रुटि को बढ़ाएगा।

void main() { 
    if (1) { 
     int i = 3; 
    } 

    printf("%d", i); 
} 

तो PHP में चर कड़ाई से ब्लॉक-स्कॉप्ड नहीं हैं? PHP में, आंतरिक ब्लॉक में परिभाषित चर का उपयोग बाहरी ब्लॉक में किया जा सकता है?

+1

यह वास्तव में एक सवाल है, तो आप पहले से ही यह अपने आप को उत्तर दिया है नहीं है। –

+2

@ बाय्रॉन - मैं बस इसकी पुष्टि करना चाहता हूं। यह मेरे लिए अजीब है जो सी – powerboy

+2

से PHP में आया था क्यों डाउनवॉटिंग? मुझे लगता है कि प्रश्न ठीक है – Andrey

उत्तर

45

PHP में केवल कार्यक्षेत्र है - if जैसे नियंत्रण संरचनाएं एक नया दायरा पेश नहीं करती हैं। हालांकि, अगर आप उन चरों का उपयोग करते हैं जिन्हें आपने घोषित नहीं किया है, तो यह भी बुरा नहीं है। $imain() के बाहर मौजूद नहीं होगा या यदि यदि कथन विफल हो जाता है, लेकिन आप अभी भी इसे आसानी से गूंज सकते हैं।

आप PHP के error_reporting सेट किया हुआ है नोटिस शामिल करने के लिए है, यह क्रम में एक E_NOTICE त्रुटि फेंकना यदि आप एक चर जो निर्धारित नहीं किया गया उपयोग करने के लिए कोशिश करेंगे। तो अगर आप था:

function main() { 
if (rand(0,1) == 0) { 
    $i = 3; 
} 
echo $i; 
}

कोड ठीक चल पाएंगे, लेकिन कुछ फांसी गूंज होगा '3' (जब if सफल होता है), और के रूप में $i परिभाषित नहीं किया जाएगा कुछ, एक E_NOTICE और गूंज कुछ भी नहीं बढ़ा देंगे गूंज कथन के दायरे में।

फ़ंक्शन के बाहर, $i कभी परिभाषित नहीं किया जाएगा (क्योंकि फ़ंक्शन का एक अलग दायरा है)।

अधिक जानकारी के लिए: http://php.net/manual/en/language.variables.scope.php

+0

के रूप में ज्ञान साझा करने के रूप में आप एक उत्तर के साथ एक प्रश्न उठा सकते हैं (इसे एक उत्तर पोस्ट करने की आवश्यकता है) बहुत अच्छी व्याख्या! – powerboy

+2

अच्छी व्याख्या! लेकिन सिर्फ इसलिए कि आप कुछ कर सकते हैं इसका मतलब यह नहीं है कि आपको चाहिए। एक वैरिएबल का उपयोग करना बुरा अभ्यास है जिसे परिभाषित नहीं किया गया है। –

+0

ओह, और आपको यह जांचने की आवश्यकता नहीं है कि रैंड कॉल का परिणाम शून्य के बराबर है या नहीं। आप रैंड से पहले एक शेबांग डाल सकते हैं :) – peter

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