2010-01-13 14 views
7

कई स्रोतों के अनुसार, register_globals (वैश्विक चर जो है) आपके php.ini में अक्षम होना चाहिए। क्या मुझे अपने कोड में परिभाषित() लिखना चाहिए और वैश्विक चर अक्षम होने पर स्थिरांक का उपयोग करना चाहिए? क्या वे भी संबंधित हैं?PHP- वैश्विक चर और स्थिरांक के बीच क्या अंतर है

उत्तर

15

वे इस बात से संबंधित हैं कि उनके पास वैश्विक दायरा है, लेकिन स्थिरांक एक बार परिभाषित नहीं होने के लिए हैं, वैश्विक वैरिएबल के विपरीत, जिस पृष्ठ के साथ यह संशोधित हो सकता है। तो बस वैश्विक के बजाय define() का उपयोग करने के लिए स्विचिंग बहुत मदद नहीं करेगा।

यह बेहतर है कि आप पैरामीटर के रूप में चर लेने के लिए अपने तरीकों को दोबारा सुधारें और चारों ओर चर पारित करने के लिए उस पर भरोसा करें।

+0

मैं चाहता हूँ निर्देशिका नाम है कि सब कुछ खत्म हो वैश्विक है, और सुलभ हो जाएगा जैसे कुछ पूर्व निर्धारित चर होने की संभावना नहीं है, तो। मैं भी वैश्विक चर अक्षम करना चाहता हूं। क्या मैं इस मामले में परिभाषित() का उपयोग कर सकता हूं? – Gal

+1

यदि आप परिवर्तनीय को संशोधित करने का इरादा नहीं रखते हैं तो पेज निष्पादित होता है, फिर हां, यह परिभाषित करने के लिए उचित उपयोग है। – Parrots

+4

@Gal, हाँ, यह एक अच्छा कारण उन्हें इस्तेमाल करने के रूप में आप रन-टाइम में बदलते निर्देशिकाओं होने के लिए नहीं जा रहे हैं। – GSto

2

कॉन्स्टेंट, जिसे एक बार परिभाषित किया गया है, बदला नहीं जा सकता है।

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

+0

मैं निर्देशिका नाम के आसपास पारित करने के लिए सक्षम होने के लिए स्थिरांक का उपयोग करना चाहते। – Gal

+0

निर्देशिका मूल्य हर तरह से बदलने के लिए, फिर, का उपयोग एक निरंतर :) – Sampson

8

यहां कुछ चीज़ें हैं।

सबसे पहले, आपके php.ini में अक्षम रजिस्टर_globals एक पुरानी PHP सुविधा को संदर्भित करता है जहां एक क्वेरी स्ट्रिंग (जीईटी) या फॉर्म (जीईटी/पीओएसटी) के माध्यम से भेजा गया कोई वैरिएबल वैश्विक PHP चर में परिवर्तित हो जाएगा। जब आप register_globals बंद करते हैं तो यह कार्यक्षमता (और होना चाहिए) अक्षम है। इसके साथ ही, आप अभी भी अपने आवेदन में वैश्विक चर परिभाषित कर सकते हैं।

सामान्य प्रोग्रामिंग शब्दों में, वैश्विक चर (PHP के रजिस्टर_ग्लोबल्स नहीं) को "खराब" माना जाता है क्योंकि जब आप प्रोग्रामर के रूप में सामना करते हैं, तो आपको पता नहीं होता कि एप्लिकेशन के अन्य भाग इसका उपयोग या परिवर्तन कर सकते हैं या इसका क्या प्रभाव हो सकता है उस वैश्विक में आपके परिवर्तन हो सकते हैं। साथ ही, यदि आप एक नए ग्लोबल वैरिएबल को परिभाषित कर रहे हैं, तो एक मौका है कि आप किसी मौजूदा चर को ओवरराइट करने जा रहे हैं जिसे कोई और भरोसा कर रहा है। जब चर को स्थानीय रूप से परिभाषित किया जाता है (एक समारोह में, या अन्य भाषाओं में एक एकल ब्लॉक में) आप स्थानीय दायरे की जांच कर सकते हैं और आमतौर पर यह निर्धारित कर सकते हैं कि उस चर में क्या परिवर्तन होगा।

दूसरी ओर, स्थिरांक कभी नहीं बदलते हैं। आप उन्हें एक बार परिभाषित करते हैं, और वे परिभाषित रहते हैं और कोई भी उन्हें बदल नहीं सकता है। यही कारण है कि ग्लोबल स्थिरांक होने से ग्लोबल स्थिरांक को "कम बुरा" माना जाता है।

+0

तब भी स्थिर हैं? क्या मुझे निर्देशिका नामों जैसे सामानों को पास करने के लिए सत्रों का उपयोग करना चाहिए? – Gal

+0

स्थिरांक केवल 'कम खराब' नहीं हैं। वे कई मामलों में उपयोग करने के लिए एक पूरी तरह से स्वीकार्य बात है, जैसे गैल निर्देशिकाओं के बारे में क्या कह रहा है। – GSto

+0

स्थिरांक, ठीक हैं, हालांकि आप ठोस तर्क है कि आप वैश्विक नामस्थान में स्थिरांक उपयोग नहीं करना चाहिए मिल जाएगा (यानी केवल वर्ग स्थिरांक इस्तेमाल किया जा सोचा)। यहां कोई सही जवाब नहीं है, केवल अलग-अलग व्यापार बंदियों के साथ जवाब। –

6

वैश्विक चर स्थिर नहीं हैं (आप वैश्विक चर के मान को बदल सकते हैं, लेकिन आप केवल एक बार स्थिर परिभाषित कर सकते हैं)।

कॉन्स्टेंट हमेशा वैश्विक नहीं होते (आप कक्षा में निरंतर घोषित कर सकते हैं)। अदिश, सरणी, या वस्तु:

इसके अलावा, वैश्विक चर के किसी भी प्रकार के हो सकता है। Constants केवल scalars हो सकता है।

मैं कहने वाला नहीं हूं कि या तो स्थिरांक या ग्लोबल्स अच्छे या बुरे हैं। जब उचित रूप से उपयोग किया जाता है, तो दोनों के पास फायदेमंद उपयोग होते हैं। register_globals सुविधा के आसपास सुरक्षा समस्याएं हैं जो ग्लोबल्स के अधिक सामान्य उपयोग से अलग हैं।

1

कुछ निरंतर उदाहरण:

<?php 

// Certainly constant 
define('MINUTES_PER_HOUR', 60); 
define('DOZEN', 12); 

// Constant, but specific to this application 
define('GREETING', 'Dear %s'); 
define('TIMEOUT', 30); 

// Configurable, but constant for this installation 
define('DATABASE', 'mydb'); 
define('IMAGES_DIRECTORY', '/tmp/images'); 

// Not constant, or some other reason why can't be constant 
$user = $_POST['userid']; 
$days_of_week = array('Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'); 

?> 
-1

यह साधारण परीक्षण का प्रयास करें:

fileA.php:

<?php 
define('SOMEVAL', 2); 
?> 

fileB.php:

<?php 
if(defined('SOMEVAL')) echo SOMEVAL; 
else echo "SOMEVAL does not exists\n"; 
include 'fileA.php'; 
if(defined('SOMEVAL')) echo 'SOMEVAL='.SOMEVAL; 
else echo "SOMEVAL does not exists\n"; 
?> 

फिर fileB चलाते हैं। php और आप देखेंगे कि मैं आप से पहले fileA.php को छोड़ दें, SOMEVAL परिभाषित नहीं किया गया है। तो इसका मतलब यह है कि आप कुछ भी परिभाषित करने से पहले, यह स्क्रिप्ट के लिए दृश्यमान नहीं होगा। बाकी

0

कुछ विचार करने के लिए - स्थिरांक, सरणियों या वस्तुओं की तरह बातें की दुकान नहीं कर सकते हैं कुछ $ करने के लिए परिभाषित जबकि वैश्विक किसी भी वैरिएबल प्रकार हो सकता है। तो कुछ मामलों में, यदि आपको वैश्विक होने के लिए कुछ चाहिए तो इसे परिभाषित() का उपयोग करके निरंतर संग्रहित नहीं किया जा सकता है, तो आप इसके बजाय $ GLOBALS का उपयोग करना चाहेंगे।

इसके अलावा, रजिस्टर और $ वैश्विक एक ही बात नहीं कर रहे हैं!

0

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

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