2008-09-20 14 views
24

मुझे php में वैश्विक चर के साथ समस्या हो रही है। मेरे पास एक फ़ाइल में $screen var सेट है, जिसके लिए एक और फ़ाइल की आवश्यकता है जो initSession() को किसी अन्य फ़ाइल में परिभाषित करता है। initSession()global $screen घोषित करता है और फिर पहली स्क्रिप्ट में मान सेट का उपयोग करके $ स्क्रीन को और नीचे संसाधित करता है।PHP में वैश्विक चर अपेक्षित के रूप में काम नहीं कर रहे हैं

यह कैसे संभव है?

चीजों को और अधिक भ्रमित करने के लिए, यदि आप फिर से $ स्क्रीन सेट करने का प्रयास करते हैं तो initSession() पर कॉल करें, यह पहले उपयोग किए जाने वाले मान का उपयोग करता है। निम्नलिखित कोड प्रक्रिया का वर्णन करेगा। क्या किसी को यह समझाने में जाना चाहिए?

$screen = "list1.inc";   // From model.php 
require "controller.php";   // From model.php 
initSession();     // From controller.php 
global $screen;     // From Include.Session.inc 
echo $screen; // prints "list1.inc" // From anywhere 
$screen = "delete1.inc";   // From model2.php 
require "controller2.php"   
initSession(); 
global $screen; 
echo $screen; // prints "list1.inc" 

अद्यतन:
तो मैं घोषणा $screen वैश्विक फिर सिर्फ दूसरे मॉडल की आवश्यकता से पहले, $ स्क्रीन ठीक initSession() विधि के लिए अद्यतन किया जाता है। अजीब।

+3

'वैश्विक $ ए; 'का उपयोग करने का कोई उपयोग नहीं है,' $ ए = और $ ग्लोबल्स [' ए ']; 'के बराबर है। यही है, यह एक ही नाम के साथ स्थानीय दायरे में एक संदर्भ बनाता है। एक समारोह के बाहर, आप हमेशा वैश्विक दायरे में रहते हैं। PHP "फ़ाइल स्कोप" प्रदान नहीं करता है। – Matthew

उत्तर

58

Global परिवर्तनीय वैश्विक नहीं बनाते हैं। मुझे पता है कि यह मुश्किल है :-)

Global कहता है कि एक स्थानीय चर का उपयोग होगा जैसे कि यह उच्च स्कोप के साथ एक चर था।

उदाहरण के लिए:

<?php 

$var = "test"; // this is accessible in all the rest of the code, even an included one 

function foo2() 
{ 
    global $var; 
    echo $var; // this print "test" 
    $var = 'test2'; 
} 

global $var; // this is totally useless, unless this file is included inside a class or function 

function foo() 
{ 
    echo $var; // this print nothing, you are using a local var 
    $var = 'test3'; 
} 

foo(); 
foo2(); 
echo $var; // this will print 'test2' 
?> 

ध्यान दें कि वैश्विक वार्स शायद ही कभी एक अच्छा विचार कर रहे हैं। आप उनके बिना 99.9 99 99% समय कोड कर सकते हैं और यदि आपके पास अस्पष्ट स्कोप नहीं हैं तो आपका कोड बनाए रखना बहुत आसान है। यदि आप कर सकते हैं global से बचें।

+0

मैं वैश्विक रूप से 'अगर आप कर सकते हैं' से बचने के साथ पूरी तरह से सहमत हैं। यह कोड एक ढांचे का हिस्सा था जिसे हम थोड़ा विस्तार करने की कोशिश कर रहे थे, इसलिए हम ग्लोबल्स से बचने में असमर्थ थे, क्योंकि हमने उन्हें वहां नहीं रखा था। –

+0

कक्षाओं के लिए यह सच है? – Snymax

+0

ग्लोबल्स सरल पटकथा के लिए बहुत उपयोगी हैं, हालांकि। Esp। यदि आपके पास कॉन्फ़िगरेशन हैं और ओओ उचित नहीं है। –

4

आपको प्रत्येक फ़ाइल के शीर्ष पर न केवल प्रत्येक फ़ंक्शन में "वैश्विक $ स्क्रीन" डालना होगा।

1

वैश्विक दायरे में शामिल हैं और आवश्यक फाइलें हैं, आपको किसी फ़ंक्शन के भीतर से चर का उपयोग न करने तक वैश्विक कीवर्ड का उपयोग करने की आवश्यकता नहीं है। आप इसके बजाय $ GLOBALS सरणी का उपयोग करने का प्रयास कर सकते हैं।

15

global $foo का मतलब यह नहीं है कि "यह चर वैश्विक बनाएं, ताकि हर कोई इसका उपयोग कर सके"। global $foo का अर्थ है "इस फ़ंक्शन के दायरे में, वैश्विक चर $foo का उपयोग करें"।

मैं आपके उदाहरण से मान रहा हूं कि हर बार, आप किसी फ़ंक्शन के भीतर से $ स्क्रीन का जिक्र कर रहे हैं। यदि ऐसा है तो आपको प्रत्येक फ़ंक्शन में global $screen का उपयोग करने की आवश्यकता होगी।

4

आप आप जो कई कार्यों का उपयोग करता एक कार्य के दौरान उपयोग करने के लिए, सामान धारण करने के लिए एक 'संदर्भ' वस्तु बनाने पर विचार चाहते चर का एक बहुत कुछ है, तो:

//We're doing "foo", and we need importantString and relevantObject to do it 
$fooContext = new StdClass(); //StdClass is an empty class 
$fooContext->importantString = "a very important string"; 
$fooContext->relevantObject = new RelevantObject(); 

doFoo($fooContext); 

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

0

इसके लिए मूल्यों को परिभाषित करने से पहले आपको एक वैरिएबल घोषित करना होगा।

+0

आपका उत्तर पूर्व स्वीकृत और अत्यधिक उत्थान वाले उत्तर में क्या जोड़ता है? टिप्पणी करने और कुछ नमूना कोड जोड़ने की देखभाल? – Yaroslav

0

यह तब तक बेकार है जब तक कि यह कार्य या कक्षा में न हो। वैश्विक अर्थ यह है कि आप प्रोग्राम के किसी भी हिस्से में एक चर का उपयोग कर सकते हैं।इसलिए यदि ग्लोबल फ़ंक्शन या क्लास में निहित नहीं है तो ग्लोबल

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