PHP में संदर्भों का उपयोग शायद ही कभी क्यों किया जाता है?


26

मेरे पास कुछ सी ++ ज्ञान है और जानते हैं कि पॉइंटर्स आमतौर पर वहां उपयोग किए जाते हैं, लेकिन मैंने PHP ओपन सोर्स कोड को देखना शुरू कर दिया है और मैं कभी भी तरीकों में संदर्भों का उपयोग करके कोड नहीं देखता हूं।

इसके बजाय, कोड हमेशा चर के संदर्भ को विधि में भेजने के बजाय एक रिटर्न मान का उपयोग करता है, जो तब उस चर के मूल्य को बदल देता है और बस इसे वापस कर देता है।

मैंने पढ़ा है कि संदर्भों का उपयोग करने से कम मेमोरी का उपयोग होता है, इसलिए उन्हें PHP में उपयोग क्यों नहीं किया जाता है?


19
पास-बाय-रेफरेंस मापदंडों का उपयोग करना "साइड-इफ़ेक्ट प्रोग्रामिंग" है - कोड को पढ़ते समय किसी एकल मान को वापस करने के लिए फ़ंक्शन का उपयोग करना काफी स्पष्ट है। उस ने कहा, काफी कुछ PHP कोर फ़ंक्शन संदर्भों का उपयोग करते हैं।
halfer

3
PHP डिफ़ॉल्ट रूप से संदर्भ द्वारा वस्तुओं को पारित करती है।

2
सरणी प्रकार कोर PHP कार्यों का एक प्रमुख उदाहरण है जो संदर्भ से गुजरता है
मार्क बेकर

2
PHP संदर्भ पॉइंटर्स नहीं हैं , और अक्सर गधे में दर्द होता है यदि आप उन्हें पूरी तरह से उम्मीद नहीं कर रहे हैं कि वे कहाँ दिखाई देंगे।
16

2
यदि आपको कई रिटर्न की आवश्यकता है, return array($foo, $bar);औरlist($A, $B) = foobar();
इज़ाकटा

जवाबों:


49

आपका दावा है कि संदर्भ का उपयोग शायद ही कभी गलत है। जैसा कि दूसरों ने पहले ही उल्लेख किया है कि मूल कार्यों का एक टन है जो संदर्भों का उपयोग करता है, उल्लेखनीय उदाहरणों में सरणी सॉर्टिंग फ़ंक्शन और preg_match()/ शामिल हैं preg_match_all()। यदि आप अपने कोड में इनमें से किसी भी फ़ंक्शन का उपयोग कर रहे हैं, तो आप संदर्भों का भी उपयोग कर रहे हैं।

आगे बढ़ते हुए, PHP में संदर्भ संकेत नहीं हैं । चूंकि आप सी ++ पृष्ठभूमि से आ रहे हैं इसलिए मैं भ्रम को समझ सकता हूं, लेकिन PHP के संदर्भ एक पूरी तरह से अलग जानवर हैं, वे एक प्रतीक तालिका में उपनाम हैं । आपके द्वारा C ++ संदर्भों से अपेक्षित कोई भी प्रदर्शन लाभ केवल PHP संदर्भों पर लागू नहीं होता है।

वास्तव में, मूल्य से गुजरने वाले अधिकांश परिदृश्यों में संदर्भ से गुजरने की तुलना में तेज और कम स्मृति गहन होती है। Zend Engine, PHP का कोर, एक कॉपी-ऑन-राइट ऑप्टिमाइज़ेशन मैकेनिज़्म का उपयोग करता है जो तब तक किसी वैरिएबल की कॉपी नहीं बनाता है जब तक कि यह संशोधित न हो जाए। संदर्भ से गुजरना आमतौर पर कॉपी-ऑन-राइट पैटर्न को तोड़ता है और आपको मूल्य को संशोधित करता है या नहीं इसकी एक कॉपी की आवश्यकता होती है।

जब आपको ज़रूरत हो तो PHP के संदर्भों का उपयोग करने से न डरें, लेकिन इसे माइक्रो-ऑप्टिमाइज़ करने के प्रयास के रूप में न करें। याद रखें, समयपूर्व अनुकूलन सभी बुराई की जड़ है

आगे की पढाई:


इस सुधार के लिए धन्यवाद @NikiC। एक आलसी का जवाब यह एक ...
यानिस

उत्तर को पूरा करने के लिए, यह बताना अच्छा होगा कि सभी वस्तुओं को PHP में संदर्भ द्वारा पारित किया जाता है।
फ्लोरियन मार्गाइन

@FlorianMargaine यह पूरी तरह से सही नहीं है (आगे पढ़ने में दूसरा लिंक देखें)।
यानिस

2
@FlorianMargaine नहीं, दोनों बहुत अलग हैं और यह महसूस करना महत्वपूर्ण है कि ऐसा क्यों है।
प्रेत

3
@FlorianMargaine नहीं, मान लें कि ऑब्जेक्ट PHP में संदर्भ द्वारा पारित किए गए थे : f($obj)दिए गए function f($x) { $x = new X; }, कॉल करने से पहले $objएक अलग ऑब्जेक्ट का संदर्भ होगा f()। हालाँकि, जब ऑब्जेक्ट संदर्भ से पारित नहीं होते हैं , तो $ obj को संशोधित नहीं किया जाता है यदि आप इसे PHP के साथ निष्पादित करते हैं। इस तरह, PHP जावा के समान है।
प्रेत ० मी ०

8

PHP पहले से ही एक कॉपी-ऑन-राइट बात करता है जहां यह एक नया मान पैदा नहीं करता है जिससे आप कुछ बदल सकते हैं, इसलिए संदर्भों का उपयोग करके बहुत अधिक मेमोरी नहीं बचती है। ऐसा करना कुछ सामानों के साथ गड़बड़ भी कर सकता है PHP आंतरिक रूप से मेमोरी उपयोग को कम करने के लिए करता है, जिससे चीजें और भी बदतर हो जाती हैं।

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

मूल रूप से, मैं केवल पास-दर-संदर्भ "बाहर" पैरामीटर के लिए उपयोगी पाते हैं, चर मैं करने की उम्मीद है, जिसका अर्थ है वापस पाने के समारोह के बजाय में पास, एक ला से preg_matchकी &$matches। यहां तक ​​कि उन कार्यों के लिए भी, जो स्पष्ट रूप से पास की जा रही वस्तु को संशोधित करते हैं, जैसे sortया array_pop, कि थोड़ा icky लगता है ... लेकिन यही हम साथ फंस गए हैं।


5

PHP एक वेब-उन्मुख भाषा है।
वेब-पेज तेजी से परोसे जा रहे हैं और हल्के होने चाहिए।
सामान्य PHP प्रोग्राम कुछ सेकंड के लिए रहता है और कुछ सौ किलोबाइट मेमोरी का उपभोग करता है।
इस तरह के अनुकूलन के लिए कोई फायदा नहीं है।


1
यह। बिंदुओं / संदर्भों की आवश्यकता नहीं है, क्योंकि यह C ++ जैसे निम्न स्तर पर गड़बड़ नहीं करता है।
केनेथ वर्डेन

8
इस पोस्ट को 5+ क्यों मिलता है ??? यह a) प्रश्न का उत्तर नहीं देता है b) सही नहीं है

1
तो संदर्भ धीमे हैं और बहुत अधिक मेमोरी का उपभोग करते हैं?
रॉकेट हज़रत

1
@RocketHazmat हाँ, अजीब बात है कि यह सच है।
यानिस

3

मक्खी पर कुछ कारण:

  • PHP एक स्क्रिप्टिंग भाषा है, और इसका उद्देश्य मुख्य एम्बेडेड सॉफ़्टवेयर के रूप में उपयोग नहीं किया जाता है (मूल रूप से, स्क्रिप्ट के अंत में मेमोरी को साफ़ किया जाता है,)
  • चूंकि PHP5, पास-दर-संदर्भ ऑब्जेक्ट मापदंडों के लिए निहित है (इसलिए PHP पास-बाय-संदर्भ "आपकी पीठ में" का उपयोग करता है)।

1
देखें: अपने दूसरे बिंदु के लिए php.net/manual/en/language.oop5.references.php
यानि

2

मुझे लगता है कि यह सिर्फ डेवलपर्स की पसंद है, भाषा से कोई लेना-देना नहीं है। बहुत सारे PHP कोड (बिल्ट-इन और न ही) संदर्भों का उपयोग करते हैं। PHP में सरणी कार्यों पर एक नज़र डालें, उनमें से बहुत सारे उपयोग संदर्भ हैं। preg_matchसंदर्भ का उपयोग करता है।

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


1

आपके प्रश्न के साथ मूलभूत समस्या यह है कि आप यह मानते हैं कि यह C ++ में भी आम है। यह नहीं है। हम आउटपुट मापदंडों को पसंद नहीं करते हैं और जितना संभव हो उतना कम उपयोग करते हैं- वे केवल सी-स्टाइल एपीआई में वास्तव में सामान्य हैं।


0

मुझे कई php फ़ंक्शन पता हैं जो ऐसा करते हैं। preg_match()उदाहरण के लिए एक नजर है । $matchesसंदर्भ द्वारा पारित किया जाएगा

यदि आप अपने लिए एक फ़ंक्शन लिखना चाहते हैं जो संदर्भ द्वारा तर्क लेता है तो निम्न सिंटैक्स का उपयोग करें

function byref(&$a, &$b, $c) {
    $a += $c;
    $b += $c;
    return $a * $b;
}

$ a और $ b को संदर्भ द्वारा पास किया जाता है $ c को मूल्य द्वारा पारित किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.