2010-07-07 24 views
12

वैश्विक चर हाँ मैं जानता हूँ कि प्रयोग किया जाता है एक बुरा व्यवहार है एक समारोह के अंदर अपरिभाषित है, लेकिन इस एक के लिए उस नियम पर कम:पीएचपी वैश्विक चर भले ही वैश्विक कीवर्ड

मेरे कोड पी:

include('something.php'); //where $from is declared 

function myfunc() { 
    global $from; 
    echo "from(myfunc)=$from<br />"; 
    ... 
} 

echo "from=$from<br />"; 
myfunc(); 

परिणाम है:

from=2010-05-01 
from(myfunc)= 

पर क्या हो रहा है? :(

संपादित करें: यदि यह मदद करता है, सब से ऊपर कोड CodeIgniter में एक दृश्य फाइल के अंदर है (और हाँ, मैं जानता हूँ कि कार्यों के अंदर देखा गया होना चाहिए नहीं कर रहे हैं: पी)

+1

मैंने इसका परीक्षण किया और यह ठीक काम करता है ('echo' के बाद अर्धविराम जोड़ने के बाद) PHP 5.3.1 पर। – Harmen

उत्तर

22

मैं एक शर्त करेंगे बियर आप इस स्निपेट के साथ वैश्विक क्षेत्र के भीतर नहीं हैं। यदि आप एक समारोह के भीतर से इस कर रहे हैं?

उस मामले में, $from आप something.php में परिभाषित नहीं वैश्विक है, जबकि एक समारोह में संदर्भ है।

यदि आप global $from; जोड़ते हैं तो यह शायद काम करेगा। $from को परिभाषित करने से पहले nside something.php

कहने की जरूरत नहीं है, यह किसी भी तरह का अच्छा अभ्यास नहीं है, और आपको गॉर्डन की सलाह का पालन करना चाहिए।

+0

हाय पेक्का, आप सही हैं। मैंने फ़ंक्शन के बाहर '$ ग्लोबल ['से'] = 'value'' जोड़ा, और मान' myfunc() 'के अंदर पाया गया। मुझे नहीं पता था कि यह पृष्ठ CodeIgniter के '$ this-> load-> view() 'फ़ंक्शन द्वारा उत्पन्न किया गया था। धन्यवाद! – Obay

11

खुद पर एक एहसान करो और Dependency Injection.

function myfunc($from) { 
    return "from(myfunc)=$from<br />"; 
} 
$from = '2010-05-01'; 
echo myfunc($from); 

का उपयोग ऐसा करने से आपके कोड और अधिक maintainable, कम मिलकर और अधिक आसानी से यूनिट-परीक्षण योग्य है क्योंकि यह वैश्विक क्षेत्र से अलग है कर देगा। इसके अलावा, जब आप ऐसा करते हैं तो लोग सोचते हैं कि आप शांत हैं।

+4

+1 मुझे कभी एहसास नहीं हुआ है कि मैं कह सकता हूं "मैं 2002 से निर्भरता इंजेक्शन कर रहा हूं" :) –

+0

धन्यवाद, मैं इसके बजाय निर्भरता इंजेक्शन का उपयोग करूँगा: पी – Obay

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