PHP वैश्विक कार्यों में


100

वैश्विक कीवर्ड की उपयोगिता क्या है ?

क्या एक विधि से दूसरे तरीके को पसंद करने के लिए कोई कारण हैं?

  • सुरक्षा?
  • प्रदर्शन?
  • और कुछ?

विधि 1:

function exempleConcat($str1, $str2)
{
  return $str1.$str2;
}

विधि 2:

function exempleConcat()
{
  global $str1, $str2;
  return $str1.$str2;
}

इसका उपयोग कब किया जाता है global?

मेरे लिए, यह खतरनाक प्रतीत होता है ... लेकिन यह सिर्फ ज्ञान की कमी हो सकती है। मुझे प्रलेखित (जैसे कोड के उदाहरण के साथ, दस्तावेज़ से लिंक ...) तकनीकी कारणों से दिलचस्पी है ।

अग्रिम में धन्यवाद!


इनाम

यह विषय के बारे में एक अच्छा सामान्य प्रश्न है, मैं (@Gordon) अतिरिक्त जवाब पाने के लिए इनाम की पेशकश कर रहा हूं। चाहे आपका जवाब मेरा सहमति के साथ हो या कोई अलग दृष्टिकोण दे कोई फर्क नहीं पड़ता। चूंकि globalविषय अब हर बार आता है, इसलिए हम लिंक करने के लिए एक अच्छा "विहित" उत्तर का उपयोग कर सकते हैं।


2
इस लिंक पर एक नज़र डालें: stackoverflow.com/questions/1557787 इस पृष्ठ के नीचे दाईं ओर संबंधित लेखों की एक बहुत है
JohnP

यह आपके प्रश्न का सीधा उत्तर नहीं है, लेकिन कृपया इस पुराने SO प्रश्न को पढ़ें
लाफुर वेज

1
इसलिए, मैं कोई भी प्रो-ग्लोबल कीवर्ड नहीं पढ़ सकता। 1) यह यहाँ क्यों है। 2) लोग इसका उपयोग क्यों करते हैं?
पास्कल क्यय

@ जी क्यू क्यों वहाँ है goto? लोग इसका उपयोग क्यों करते हैं? वे इसका उपयोग नहीं करते (मुझे कम से कम उम्मीद है): P
PeeHaa

पिछले साल (14 दिसंबर) के अंत में, किसी ने इस प्रश्न को कम कर दिया है। मुझे यह जानने में बहुत दिलचस्पी है कि क्यों, क्योंकि नकारात्मक लोगों सहित सभी दृष्टिकोण दिलचस्प हैं। इस मामले में पहले से कहीं ज्यादा! मैं इसके बारे में किसी भी सुराग के लिए बहुत आभारी रहूंगा।
पास्कल क्यी

जवाबों:


158

ग्लोबल्स बुराई हैं

यह globalकीवर्ड के साथ-साथ बाकी सब चीज़ों के लिए भी सही है जो एक स्थानीय दायरे से वैश्विक दायरे (स्टेटिक्स, सिंग्लेटों, रजिस्ट्रियों, कॉन्स्टेंट्स) तक पहुंचती है। आप उनका उपयोग नहीं करना चाहते हैं। एक फ़ंक्शन कॉल में बाहर की किसी भी चीज़ पर निर्भर नहीं होना चाहिए, जैसे

function fn()
{
    global $foo;              // never ever use that
    $a = SOME_CONSTANT        // do not use that
    $b = Foo::SOME_CONSTANT;  // do not use that unless self::
    $c = $GLOBALS['foo'];     // incl. any other superglobal ($_GET, …)
    $d = Foo::bar();          // any static call, incl. Singletons and Registries
}

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

सुपरग्लोबल्स का उपयोग करना एक स्पष्ट दोष नहीं हो सकता है, लेकिन यदि आप अपने कोड को कमांड लाइन से कॉल करते हैं, तो आपके पास $_GETया नहीं है $_POST। यदि आपका कोड इन से इनपुट पर निर्भर करता है, तो आप अपने आप को एक वेब वातावरण में सीमित कर रहे हैं। बस एक वस्तु में अनुरोध सार और इसके बजाय का उपयोग करें।

हार्डकॉस्ट किए गए क्लासनेम (स्थैतिक, स्थिरांक) को युग्मित करने के मामले में, आपका फ़ंक्शन भी मौजूद नहीं हो सकता है क्योंकि वह क्लास उपलब्ध नहीं है। जब यह समान नामस्थान से कक्षाएं लेता है, तो यह एक समस्या से कम है, लेकिन जब आप विभिन्न नामस्थानों से मिश्रण करना शुरू करते हैं, तो आप एक पेचीदा गड़बड़ पैदा कर रहे हैं।

पुन: उपयोग करने से उपरोक्त सभी से गंभीर रूप से बाधा उत्पन्न होती है। तो इकाई-परीक्षण है

इसके अलावा, आपके कार्य हस्ताक्षर तब झूठ बोल रहे हैं जब आप वैश्विक दायरे में रहते हैं

function fn()

एक झूठा है, क्योंकि यह दावा करता है कि मैं उस फ़ंक्शन को बिना कुछ भी पास किए कॉल कर सकता हूं। यह केवल तब होता है जब मैं फ़ंक्शन बॉडी को देखता हूं जो मुझे लगता है कि मुझे पर्यावरण को एक निश्चित स्थिति में स्थापित करना है।

यदि आपके फ़ंक्शन को चलाने के लिए तर्क की आवश्यकता है, तो उन्हें स्पष्ट करें और उन्हें पास करें:

function fn($arg1, $arg2)
{
    // do sth with $arguments
}

स्पष्ट रूप से हस्ताक्षर से पता चलता है कि इसे क्या कहा जाना चाहिए। यह विशिष्ट अवस्था में होने के लिए पर्यावरण पर निर्भर नहीं है। आपको नहीं करना है

$arg1 = 'foo';
$arg2 = 'bar';
fn();

यह (वैश्विक कीवर्ड) बनाम (तर्कों) में धक्का देने की बात है। जब आप / इंजेक्शन निर्भरता में धक्का देते हैं, तो फ़ंक्शन अब बाहर पर निर्भर नहीं करता है। जब आप करते हैं तो fn(1)आपके पास एक चर 1 कहीं बाहर नहीं होना चाहिए। लेकिन जब आप $oneफ़ंक्शन के अंदर वैश्विक रूप से खींचते हैं , तो आप वैश्विक दायरे में रहते हैं और यह उम्मीद करते हैं कि कहीं न कहीं इसका एक चर होगा। फ़ंक्शन अब स्वतंत्र नहीं है।

इससे भी बदतर, जब आप अपने फ़ंक्शन के अंदर ग्लोबल्स बदल रहे हैं, तो आपका कोड जल्दी से पूरी तरह से समझ से बाहर हो जाएगा, क्योंकि आपके कार्यों में सभी जगह साइडइफेक्ट्स हो रहे हैं।

एक बेहतर उदाहरण के अभाव में, विचार करें

function fn()
{
    global $foo;
    echo $foo;     // side effect: echo'ing
    $foo = 'bar';  // side effect: changing
}

और फिर आप करते हैं

$foo = 'foo';
fn(); // prints foo
fn(); // prints bar <-- WTF!!

यह देखने का कोई तरीका नहीं है कि $fooइन तीन लाइनों से बदल गया है। एक ही फ़ंक्शन को समान परिवर्तन वाले सभी तर्कों के साथ क्यों आउटपुट किया जाता है या वैश्विक स्थिति में मान बदल जाता है? एक फ़ंक्शन को परिभाषित इनपुट Y. हमेशा के लिए X करना चाहिए।

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

और अधिक संसाधनों:


10
PHP ऐसी चीजों को क्यों लागू करता है? क्या कोई उपयोगिता है? मैं हमेशा PHP में खतरनाक कार्यान्वयन से आश्चर्यचकित हूं कि बहुत से लोग हर समय का उपयोग करते हैं ... यह मुश्किल है कि मुझे विश्वास है कि कोई तार्किक कारण नहीं हैं!
पास्कल काय

5
काश आप ग्लोबल्स को बड़ा कर सकते हैं ।
करमीत

3
वाह, आखिरकार किसी ने अच्छी तरह से समझाया कि ग्लोबल्स बुराई क्यों हैं ... मैंने हमेशा सुना है कि वे थे और मैंने कुछ बहुत ही विशिष्ट उदाहरणों को देखा कि क्यों लेकिन यह वास्तव में सामान्य कारण के लिए एक अच्छा और व्यापक स्पष्टीकरण है। +1
विंगब्लैड

मुझे वास्तव में देर हो गई है, और मैं समझ रहा हूं कि आप क्या कह रहे हैं, लेकिन mysqli कनेक्शन के बारे में कैसे? क्या उन्हें हर बार एक पैरामीटर के रूप में पारित किया जाना चाहिए, या एक वैश्विक $ लिंक है; आपकी आँखों में अनुमति है?
मेव

2
आप सही हैं, स्थिरांक को छोड़कर। वे एप्लिकेशन के "राज्य" का प्रतिनिधित्व नहीं करते हैं और उन्हें किसी फ़ंक्शन के भीतर से संदर्भित करना ठीक है। यदि यह अंदर से एक निरंतर उपयोग कर रहा है तो फ़ंक्शन "झूठ" नहीं करता है। मैं सहमत हूं कि इसका मतलब है कि एक बिंदु पर प्रोग्रामर को बाहरी ज्ञान था, लेकिन यह एक निरंतर स्वीकार्य व्यापार है जो एक स्थिर है। इसके अलावा, गंभीरता से, यह बहुत बड़ी बात नहीं है।
सेबास

35

इसके खिलाफ एक बड़ा कारण globalयह है कि इसका मतलब है कि फ़ंक्शन दूसरे दायरे पर निर्भर है। यह बहुत जल्दी गड़बड़ हो जाएगा।

$str1 = 'foo';
$str2 = 'bar';
$str3 = exampleConcat();

बनाम

$str = exampleConcat('foo', 'bar');

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

global$dbसंसाधनों जैसे वैश्विक चीजों को शामिल करने के लिए भी एक बुरा पैटर्न है। वहाँ होगा दिन आते हैं जब आप नाम बदलना चाहते हैं $db, बल्कि इसलिए अपने पूरे आवेदन नाम पर निर्भर करता है, नहीं कर सकता।

किसी भी आधे से जटिल आवेदन को लिखने के लिए चर का दायरा सीमित करना और अलग करना आवश्यक है


1
मुझे क्षमा करें, लेकिन मैं नाम बदलना क्यों चाहूंगा $db? यह पीडीओ है, हर जगह से गुजरता है। जब मैं कनेक्शन जानकारी को अलग से अपडेट कर सकता हूं तो इसे क्यों बदला जाएगा?
केसी ड्वेन

3
@kcd क्योंकि एक दिन आपको पता चलता है कि निर्भरता इंजेक्शन कितना बढ़िया है और आप अपने ऐप को रिस्ट्रक्चर करना चाहते हैं? एक दिन क्योंकि आप कुछ अन्य सामान के साथ अपना सामान एकीकृत करने की आवश्यकता होगी भी एक वैश्विक उपयोग करता $dbचर? क्योंकि एक दिन आप इकाई परीक्षण की खोज करेंगे और उसके लिए एक समय में एक से अधिक डेटाबेस कनेक्शन का प्रबंधन करने की आवश्यकता होगी? कई, कई कारण।
deceze

35

ग्लोबल्स अपरिहार्य हैं।

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

ज़ेंड के इस कोड पर एक नज़र डालें - और कृपया यह समझें कि मुझे सुझाव नहीं है कि 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 से आता है: 'पर्सनल हां, प्राइवेट नो'। जब कोई फ़ंक्शन अपने स्वयं के कामकाज के लिए एक वैश्विक चर के मूल्य को बदल रहा है, तो क्या मैं उस वैश्विक चर और बग के निजी उपयोग को कॉल करूंगा। लेकिन जब वैश्विक परिवर्तन का परिवर्तन संपूर्ण रूप से अनुप्रयोग के समुचित प्रसंस्करण के लिए किया जाता है, जैसे लॉगिन पृष्ठ पर उपयोगकर्ता का पुनर्निर्देशन, तो यह है कि मेरी राय में संभवतः अच्छा डिज़ाइन, परिभाषा के अनुसार बुरा नहीं है और निश्चित रूप से नहीं विरोधी पैटर्न।

गॉर्डन, धोखेबाज़ और ज़िज़फर के जवाबों के प्रतिशोध में: वे सभी 'निजी हाँ' (और बग) उदाहरण के तौर पर रखते हैं। यही कारण है कि वे ग्लोबल्स के उपयोग के विरोध में हैं। मैं भी करूंगा। वे, हालांकि, 'व्यक्तिगत हाँ, निजी नहीं'-उदाहरणों के साथ नहीं आते हैं जैसे मैंने इस उत्तर में कई बार किया है।


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

@ ऐरजेन: यदि आप Drupal 7.14 में कीवर्ड ग्लोबल खोजते हैं, तो आपको सैकड़ों हिट मिलेंगे। यह सार्वजनिक बसने वालों के साथ एक पुरानी समस्या है: आप उस स्थान को नियंत्रित नहीं करते हैं जहाँ उन्हें बदलने के बाद आप उन्हें सार्वजनिक करते हैं। यह सलाह दी गई है कि उन्हें बिल्कुल भी उपयोग न करें या उन्हें निजी घोषित न करें, इसलिए इसे बाद में जोड़ा नहीं जा सकता है।
लूक बर्गमैन

@ अर्जन: आपके नाम की वर्तनी के साथ मेरी त्रुटि के कारण आपको मेरी प्रतिक्रिया की कोई सूचना नहीं मिली। अब आप करेंगे। :-)
लोके बर्गमैन

@LekBergman: ड्रुपल global7.26 (जो कि नवीनतम संस्करण है) में शब्द के लिए लगभग 400 हिट हैं , उनमें से कुछ हिट टिप्पणी में हैं और कई अन्य कोड में दिखाई देते हैं जो वर्षों से छुआ नहीं गया है। मुझे यकीन है कि वे globalड्रुपल 8 में उपयोग नहीं करेंगे आशा है
अरजन

@LekBergman कृपया सेटर और गेटर्स का उपयोग करें। यह सेट अप करने के लिए अधिक समय नहीं लेता है और दूसरों को जो आपके कोड का उपयोग कर रहे हैं और संभवत: अधिक नियंत्रण रखने के लिए आपकी कक्षाओं का विस्तार कर रहे हैं। एक बार जब आप एक पैरामीटर सार्वजनिक करते हैं, तो वह इसे करता है। आपके पास इसे बाद में छिपाने का विकल्प नहीं है।
mAsT3RpEE

15

सीधे शब्दों में कहें तो globalआधुनिक PHP कोड IMHO में शायद ही कभी एक अच्छा कारण होता है । खासकर यदि आप PHP 5 का उपयोग कर रहे हैं और विशेष रूप से यदि आप ऑब्जेक्ट ओरिएंटेड कोड विकसित कर रहे हैं।

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

function getCustomer($db, $id) {
    $row = $db->fetchRow('SELECT * FROM customer WHERE id = '.$db->quote($id));
    return $row;
}

10

PHP में वैश्विक कीवर्ड के उपयोग से संकोच न करें। खासतौर पर ऐसे लोगों को न लें जो बाहरी तौर पर उपदेश / चिल्ला रहे हों कि ग्लोबल्स 'बुराई' और क्या नहीं है।

सबसे पहले, क्योंकि आप जो पूरी तरह से उपयोग करते हैं वह स्थिति और समस्या पर निर्भर करता है, और कोडिंग में कुछ भी करने का कोई एक समाधान / तरीका नहीं है। पूरी तरह से समीकरण में 'बुराई' जैसे अपरिहार्य, व्यक्तिपरक, धार्मिक विशेषणों की गिरावट को छोड़कर।

इसका स्पष्ट उदाहरण :

वर्डप्रेस और इसका पारिस्थितिकी तंत्र अपने कार्यों में वैश्विक कीवर्ड का उपयोग करता है। कोड OOP हो या OOP न हो।

और अब के रूप में Wordpress मूल रूप से इंटरनेट का 18.9% है, और इसके बड़े पैमाने पर megasites / असंख्य दिग्गजों के ऐप को Reuters से लेकर Sony, NYT तक, CNN को चला रहा है।

और यह इसे अच्छी तरह से करता है।

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

ऐसे लोग हो सकते हैं जो Wordpress, उसके पारिस्थितिकी तंत्र, उनकी प्रथाओं और उन भागों में चारों ओर घूमते हैं और उनकी आलोचना करते हैं।

व्यर्थ है, क्योंकि यह पारिस्थितिकी तंत्र लगभग पूरे इंटरनेट का 20% हिस्सा है। जाहिर है, यह काम करता है, यह अपना काम करता है और अधिक। जिसका अर्थ है कि यह वैश्विक कीवर्ड के लिए समान है।

एक और अच्छा उदाहरण है "आइफ्रेम इज एविल" कट्टरवाद। एक दशक पहले iframes का उपयोग करना विधर्मी था। और इंटरनेट के आसपास हजारों लोग उनके खिलाफ प्रचार कर रहे थे। उसके बाद facebook आता है, फिर सामाजिक आता है, अब iframes हर जगह 'लाइक' बॉक्स से लेकर ऑथेंटिकेशन तक, और वॉइला - सब बंद हो जाता है। ऐसे लोग हैं जो अभी भी चुप नहीं हुए - सही या गलत तरीके से। लेकिन आप जानते हैं कि इस तरह के विचारों के बावजूद जीवन आगे बढ़ता है, और यहां तक ​​कि जो लोग एक दशक पहले आईफ्रेम के खिलाफ प्रचार कर रहे थे, अब उन्हें एक शब्द कहे बिना अपने संगठन के स्वयं के अनुप्रयोगों के लिए विभिन्न सामाजिक एप्लिकेशन को एकीकृत करने के लिए उपयोग करना है।

......

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

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

पास के, मध्यम और दीर्घकालिक भविष्य के लिए उचित विचार के साथ, AT HAND की समस्या के लिए जो भी सबसे अच्छा अर्थ है, उसका उपयोग करें। किसी भी सुविधा या दृष्टिकोण का उपयोग करने से कतराएं नहीं क्योंकि इसमें किसी भी कोडर उपसमूह के बीच वैचारिक वैमनस्य है।

वे आपका काम नहीं करेंगे। आप। अपनी परिस्थितियों के अनुसार कार्य करें।


3
विरोधी कट्टरपंथ के लिए +1 और इसलिए, लेकिन यह कहना कि "बहुत से लोग इसका उपयोग करते हैं / यह काम करते हैं / आदि" केवल एक "बहस का विज्ञापन पॉपुलम" है, एक बुनियादी परिष्कार है। वास्तव में अधिकांश लोग सोचते हैं या एक बात साबित नहीं होती है कि वे सही हैं! एक भीड़ में, यदि कोई खतरा दिखाई देता है, तो अधिकांश लोग बेवकूफ बातें करेंगे, और कुछ लोग दूसरों के पेट में मर जाएंगे। क्या वे पाँच साल की इस छोटी बच्ची के चेहरे पर अपना पैर रखना सही समझते हैं क्योंकि उन्हें लगता है कि उन्हें बिल्कुल एक दरवाजे को धक्का देना चाहिए जो अगर आग से बचने के लिए खींचा जाए तो ही खुलता है? मुझे ऐसा नहीं लगता है ...
पास्कल क्यू

1
बेशक कुछ करने से बहुमत अपने आप में कुछ भी मान्य नहीं करता है। हालाँकि, मामला सॉफ्टवेयर है। और अगर बहुमत यह कर रहा है, और इन लोगों द्वारा बनाई गई अधिकांश एप्लिकेशन और सेवाएँ अच्छी तरह से पकड़ रही हैं (कई अन्य लोगों के लिए वर्डप्रेस) तो इसका मतलब है कि उनका उपयोग किया जा सकता है।
unity100

7

मुझे लगता है कि ग्लोबल्स के नकारात्मक पहलुओं पर हर किसी ने बहुत विस्तार किया है। इसलिए मैं सकारात्मकता के साथ-साथ ग्लोबल्स के उचित उपयोग के निर्देश भी जोड़ूंगा:

  1. ग्लोबल्स का मुख्य उद्देश्य कार्यों के बीच जानकारी साझा करना था। वापस जब एक वर्ग की तरह कुछ भी नहीं था, php कोड कार्यों का एक समूह शामिल थे। कभी-कभी आपको कार्यों के बीच जानकारी साझा करने की आवश्यकता होगी। आमतौर पर वैश्विक का उपयोग यह करने के लिए किया जाता था कि डेटा को वैश्विक बनाकर दूषित होने के जोखिम के साथ।

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

    वर्ग के निर्माण के कारण, अब सामान्य कार्यों को आसानी से एक कक्षा में बांटा जा सकता है और डेटा साझा किया जा सकता है। मध्यस्थों की तरह कार्यान्वयन के माध्यम से भी असंबंधित वस्तुएं जानकारी साझा कर सकती हैं। यह अब आवश्यक नहीं है।

  2. ग्लोबल्स का एक अन्य उपयोग कॉन्फ़िगरेशन उद्देश्यों के लिए है। अधिकतर स्क्रिप्ट की शुरुआत में किसी भी ऑटोलॉकर को लोड किए जाने से पहले, डेटाबेस कनेक्शन बनाया जाता है, आदि।

    संसाधनों के लोडिंग के दौरान, ग्लोबल्स का उपयोग डेटा को कॉन्फ़िगर करने के लिए किया जा सकता है (अर्थात जहां लाइब्रेरी फ़ाइलों का उपयोग करने के लिए डेटाबेस, सर्वर का यूआरएल आदि)। ऐसा करने का सबसे अच्छा तरीका define()फ़ंक्शन का उपयोग है क्योंकि ये मान अक्सर बदलते नहीं हैं और आसानी से कॉन्फ़िगरेशन फ़ाइल में रखे जा सकते हैं।

  3. ग्लोबल्स का अंतिम उपयोग आम डेटा (यानी CRLF, IMAGE_DIR, IMAGE_DIR_URL), मानव पठनीय स्टेटस फ्लैग (यानी ITERATOR_IS_RECURSIVE) को पकड़ना है। यहां ग्लोबल्स का उपयोग उन सूचनाओं को संग्रहीत करने के लिए किया जाता है, जिनका उपयोग एप्लिकेशन वाइड करने के लिए किया जाता है, जिससे उन्हें परिवर्तित करने की अनुमति मिलती है और उन परिवर्तनों को एप्लिकेशन चौड़ा दिखाई देता है।

  4. जब किसी वस्तु के प्रत्येक उदाहरण में मेमोरी होती है, तो php4 के दौरान सिंगलटन पैटर्न php में लोकप्रिय हो गया। सिंगलटन ने एक वस्तु के केवल एक उदाहरण को बनाने की अनुमति देकर राम को बचाने में मदद की। संदर्भ से पहले भी निर्भरता इंजेक्शन एक बुरा विचार होता।

    PHP 5.4+ से वस्तुओं का नया php क्रियान्वयन इन समस्याओं में से अधिकांश का ध्यान रखता है, आप सुरक्षित रूप से वस्तुओं को किसी भी तरह से किसी भी तरह के दंड के साथ पास कर सकते हैं। यह अब आवश्यक नहीं है।

    एकल के लिए एक और उपयोग एक विशेष उदाहरण है जहां एक समय में किसी वस्तु का केवल एक उदाहरण मौजूद होना चाहिए, वह उदाहरण स्क्रिप्ट निष्पादन से पहले / बाद में मौजूद हो सकता है और उस वस्तु को विभिन्न लिपियों / सर्वर / भाषाओं आदि के बीच साझा किया जाता है। यहां एक सिंगलटन पैटर्न हल करता है। समाधान काफी अच्छी तरह से।

इसलिए निष्कर्ष में अगर आप 1, 2 या 3 की स्थिति में हैं तो वैश्विक उपयोग करना उचित होगा। हालांकि अन्य स्थितियों में विधि 1 का उपयोग किया जाना चाहिए।

किसी भी अन्य उदाहरण को अद्यतन करने के लिए स्वतंत्र महसूस करें जहां ग्लोबल्स का उपयोग किया जाना चाहिए।


6

यह कोई मतलब नहीं है कि वैश्विक कीवर्ड का उपयोग करके एक कॉनैट फ़ंक्शन बना सकता है।

इसका उपयोग वैश्विक चर जैसे डेटाबेस ऑब्जेक्ट तक पहुंचने के लिए किया जाता है।

उदाहरण:

function getCustomer($id) {
  global $db;
  $row = $db->fetchRow('SELECT * FROM customer WHERE id = '.$db->quote($id));
  return $row;
}

इसे सिंगलटन पैटर्न पर बदलाव के रूप में इस्तेमाल किया जा सकता है


"इसका कोई मतलब नहीं है" - वास्तव में यह होता है: एक उदाहरण ओओपी का उपयोग किए बिना एक लुकअप टेबल को लागू करना होगा।
नीर अल्फ़ासी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.