ग्लोबल्स अपरिहार्य हैं।
यह एक पुरानी चर्चा है, लेकिन मैं अभी भी कुछ विचारों को जोड़ना चाहूंगा क्योंकि मैं उपरोक्त वर्णित उत्तरों में याद करता हूं। वे जवाब सरल करते हैं कि एक वैश्विक बहुत अधिक है और वर्तमान समाधान जो समस्या के सभी समाधानों में नहीं हैं। समस्या यह है: वैश्विक चर और खोजशब्द वैश्विक के उपयोग से निपटने का उचित तरीका क्या है? इसके लिए हमें सबसे पहले यह जांचना और वर्णन करना होगा कि वैश्विक क्या है।
ज़ेंड के इस कोड पर एक नज़र डालें - और कृपया यह समझें कि मुझे सुझाव नहीं है कि Zend बुरी तरह से लिखा गया है:
class DecoratorPluginManager extends AbstractPluginManager
{
/**
* Default set of decorators
*
* @var array
*/
protected $invokableClasses = array(
'htmlcloud' => 'Zend\Tag\Cloud\Decorator\HtmlCloud',
'htmltag' => 'Zend\Tag\Cloud\Decorator\HtmlTag',
'tag' => 'Zend\Tag\Cloud\Decorator\HtmlTag',
);
यहां बहुत सारी अदृश्य निर्भरताएं हैं। वे स्थिरांक वास्तव में वर्ग हैं। आप इस फ्रेमवर्क के कुछ पन्नों में आवश्यकताएं देख सकते हैं। आवश्यकता_ एक वैश्विक निर्भरता है, इसलिए बाहरी निर्भरता का निर्माण होता है। यह एक ढांचे के लिए अपरिहार्य है। आप बहुत सारे बाहरी कोड के बिना डेकोरेटरप्लगिनमैनगर जैसी क्लास कैसे बना सकते हैं, जिस पर यह निर्भर करता है? यह बहुत अधिक एक्सट्रा के बिना कार्य नहीं कर सकता है। Zend फ्रेमवर्क का उपयोग करते हुए, क्या आपने कभी इंटरफ़ेस के कार्यान्वयन को बदल दिया है? एक इंटरफ़ेस वास्तव में एक वैश्विक है।
एक अन्य विश्व स्तर पर उपयोग किया जाने वाला अनुप्रयोग Drupal है। वे उचित डिजाइन के बारे में बहुत चिंतित हैं, लेकिन किसी भी बड़े ढांचे की तरह, उनके पास बहुत अधिक बाहरी निर्भरताएं हैं। इस पृष्ठ पर नज़र डालें:
/**
* @file
* Initiates a browser-based installation of Drupal.
*/
/**
* Root directory of Drupal installation.
*/
define('DRUPAL_ROOT', getcwd());
/**
* Global flag to indicate that site is in installation mode.
*/
define('MAINTENANCE_MODE', 'install');
// Exit early if running an incompatible PHP version to avoid fatal errors.
if (version_compare(PHP_VERSION, '5.2.4') < 0) {
print 'Your PHP installation is too old. Drupal requires at least PHP 5.2.4. See the <a href="http://drupal.org/requirements">system requirements</a> page for more information.';
exit;
}
// Start the installer.
require_once DRUPAL_ROOT . '/includes/install.core.inc';
install_drupal();
कभी लॉगिन पेज पर रीडायरेक्ट लिखा है? यह एक वैश्विक मूल्य बदल रहा है। (और फिर आप 'डब्ल्यूटीएफ' नहीं कह रहे हैं, जिसे मैं आपके आवेदन के खराब प्रलेखन के लिए एक अच्छी प्रतिक्रिया के रूप में मानता हूं।) ग्लोबल्स के साथ समस्या यह नहीं है कि वे ग्लोबल्स हैं, आपको एक सार्थक आवेदन करने के लिए उनकी आवश्यकता है। समस्या समग्र अनुप्रयोग की जटिलता है जो इसे संभालने के लिए एक बुरा सपना बना सकती है। सत्र ग्लोबल्स हैं, $ _POST एक वैश्विक है, DRUPAL_ROOT एक वैश्विक है, इसमें शामिल / install.core.inc 'एक अनअमॉडिफिक ग्लोबल है। किसी भी फ़ंक्शन के बाहर बड़ी दुनिया है जो उस फ़ंक्शन को अपना काम करने देने के लिए आवश्यक है।
गॉर्डन का जवाब गलत है, क्योंकि वह एक समारोह की स्वतंत्रता का उल्लंघन करता है और एक फ़ंक्शन को झूठा कहकर स्थिति की देखरेख करता है। फ़ंक्शंस झूठ नहीं बोलते हैं और जब आप उसके उदाहरण पर एक नज़र डालते हैं तो फ़ंक्शन अनुचित तरीके से डिज़ाइन किया जाता है - उसका उदाहरण एक बग है। (वैसे, मैं इस निष्कर्ष से सहमत हूं कि किसी को कोड को कम करना चाहिए।) छल का जवाब वास्तव में स्थिति की उचित परिभाषा नहीं है। कार्य हमेशा एक व्यापक दायरे में कार्य करते हैं और उनका उदाहरण बहुत सरल है। हम सभी उससे सहमत होंगे कि यह कार्य पूरी तरह से बेकार है, क्योंकि यह एक स्थिर रिटर्न देता है। यह फ़ंक्शन किसी भी तरह से खराब डिज़ाइन है। यदि आप यह दिखाना चाहते हैं कि अभ्यास खराब है, तो कृपया एक प्रासंगिक उदाहरण दें। एक आवेदन में चर नाम बदलना कोई बड़ी बात नहीं है कि एक अच्छा आईडीई (या एक उपकरण) हो। सवाल वेरिएबल के स्कोप के बारे में है, न कि फंक्शन के स्कोप में अंतर के बारे में। किसी फंक्शन के लिए प्रक्रिया में अपनी भूमिका निभाने का एक उचित समय होता है (इसीलिए इसे पहली जगह में बनाया जाता है) और उस उचित समय पर यह पूरी तरह से एप्लिकेशन की कार्यप्रणाली को प्रभावित कर सकता है, इसलिए यह ग्लोबल वैरिएबल पर भी काम कर रहा है। । Xzyfer का उत्तर तर्क के बिना एक बयान है। यदि आप प्रक्रियात्मक कार्य या ओओपी डिज़ाइन करते हैं तो ग्लोबल्स एक आवेदन में मौजूद हैं। वैश्विक रूप से मूल्य बदलने के अगले दो तरीके अनिवार्य रूप से समान हैं: इसलिए भी वैश्विक चर पर काम कर रहा है। Xzyfer का उत्तर तर्क के बिना एक बयान है। यदि आप प्रक्रियात्मक कार्य या ओओपी डिज़ाइन करते हैं तो ग्लोबल्स एक आवेदन में मौजूद हैं। वैश्विक रूप से मूल्य बदलने के अगले दो तरीके अनिवार्य रूप से समान हैं: इसलिए भी वैश्विक चर पर काम कर रहा है। Xzyfer का उत्तर तर्क के बिना एक बयान है। यदि आप प्रक्रियात्मक कार्य या ओओपी डिज़ाइन करते हैं तो ग्लोबल्स एक आवेदन में मौजूद हैं। वैश्विक रूप से मूल्य बदलने के अगले दो तरीके अनिवार्य रूप से समान हैं:
function xzy($var){
global $z;
$z = $var;
}
function setZ($var){
$this->z = $var;
}
दोनों उदाहरणों में एक विशिष्ट फ़ंक्शन के भीतर $ z का मूल्य बदल जाता है। प्रोग्रामिंग के दोनों तरीकों से आप कोड में अन्य स्थानों के एक समूह में उन परिवर्तनों को कर सकते हैं। आप कह सकते हैं कि ग्लोबल का उपयोग करके आप कहीं भी $ z कॉल कर सकते हैं और वहां बदल सकते हैं। हाँ तुम कर सकते हो। लेकिन क्या तुम करोगे? और जब अयोग्य स्थानों पर किया जाता है, तो क्या इसे बग नहीं कहा जाना चाहिए?
बॉब Fanger xzyfer पर टिप्पणी करता है।
क्या तब किसी को भी कुछ भी और विशेष रूप से कीवर्ड 'ग्लोबल' का उपयोग करना चाहिए? नहीं, लेकिन किसी भी प्रकार के डिजाइन की तरह, इस पर विश्लेषण करने की कोशिश करें कि यह क्या निर्भर करता है और क्या निर्भर करता है। यह जानने की कोशिश करें कि यह कब बदलता है और कैसे बदलता है। वैश्विक मूल्यों को बदलना केवल उन चरों के साथ होना चाहिए जो हर अनुरोध / प्रतिक्रिया के साथ बदल सकते हैं। यही है, केवल उन चरों के लिए जो किसी प्रक्रिया के कार्यात्मक प्रवाह से संबंधित हैं, न कि इसके तकनीकी कार्यान्वयन के लिए। लॉगिन पृष्ठ के लिए URL का पुनर्निर्देशन एक प्रक्रिया के कार्यात्मक प्रवाह के अंतर्गत आता है, कार्यान्वयन वर्ग जो इंटरफ़ेस के लिए तकनीकी कार्यान्वयन के लिए उपयोग किया जाता है। आप एप्लिकेशन के विभिन्न संस्करणों के दौरान बाद को बदल सकते हैं, लेकिन हर अनुरोध / प्रतिक्रिया के साथ उन्हें नहीं बदलना चाहिए।
यह समझने के लिए कि कब ग्लोबल्स और कीवर्ड ग्लोबल के साथ काम करने में कोई समस्या है और जब मैं अगला वाक्य नहीं पेश करूंगा, जो ब्लॉग के बारे में लिखते समय Wim de Bie से आता है: 'पर्सनल हां, प्राइवेट नो'। जब कोई फ़ंक्शन अपने स्वयं के कामकाज के लिए एक वैश्विक चर के मूल्य को बदल रहा है, तो क्या मैं उस वैश्विक चर और बग के निजी उपयोग को कॉल करूंगा। लेकिन जब वैश्विक परिवर्तन का परिवर्तन संपूर्ण रूप से अनुप्रयोग के समुचित प्रसंस्करण के लिए किया जाता है, जैसे लॉगिन पृष्ठ पर उपयोगकर्ता का पुनर्निर्देशन, तो यह है कि मेरी राय में संभवतः अच्छा डिज़ाइन, परिभाषा के अनुसार बुरा नहीं है और निश्चित रूप से नहीं विरोधी पैटर्न।
गॉर्डन, धोखेबाज़ और ज़िज़फर के जवाबों के प्रतिशोध में: वे सभी 'निजी हाँ' (और बग) उदाहरण के तौर पर रखते हैं। यही कारण है कि वे ग्लोबल्स के उपयोग के विरोध में हैं। मैं भी करूंगा। वे, हालांकि, 'व्यक्तिगत हाँ, निजी नहीं'-उदाहरणों के साथ नहीं आते हैं जैसे मैंने इस उत्तर में कई बार किया है।