PHP वर्ग विधियों में एक प्रमुख अंडरस्कोर के साथ सौदा क्या है?


155

विभिन्न PHP पुस्तकालयों की तलाश में, मैंने देखा है कि बहुत से लोग एक एकल अंडरस्कोर के साथ कुछ वर्ग विधियों को उपसर्ग करना चुनते हैं, जैसे कि

public function _foo()

...के बजाय...

public function foo()

मुझे एहसास है कि अंततः यह व्यक्तिगत प्राथमिकता के लिए नीचे आता है, लेकिन मैं सोच रहा था कि किसी को कुछ अंतर्दृष्टि थी कि यह आदत कहां से आती है।

मेरा विचार है कि इसे शायद PHP 4 से लिया जा रहा है, इससे पहले कि कक्षा के तरीकों को संरक्षित या निजी के रूप में चिह्नित किया जा सकता है, "कक्षा के बाहर से इस पद्धति को कॉल न करें" के रूप में। हालाँकि, मेरे साथ यह भी हुआ कि शायद इसकी उत्पत्ति कहीं (एक ऐसी भाषा) से हुई जिससे मैं परिचित नहीं हूँ या इसके पीछे कोई तर्क हो सकता है कि मुझे जानने से फायदा होगा।

किसी भी विचार, अंतर्दृष्टि और / या राय की सराहना की जाएगी।


9
अपडेट 2014: यह आधिकारिक रूप से पुराना वाक्यविन्यास है: github.com/php-fig/fig-standards/blob/master/accepted/…
Sliq

जवाबों:


155

यह ऑब्जेक्ट ओरिएंटेड PHP (PHP 4) के पुराने दिनों से है। OO का कार्यान्वयन बहुत बुरा था, और इसमें निजी तरीकों जैसी चीजें शामिल नहीं थीं। क्षतिपूर्ति करने के लिए, PHP डेवलपर्स ने उन तरीकों को पूर्वनिर्धारित किया, जिनका उद्देश्य अंडरस्कोर के साथ निजी होना था। कुछ पुराने वर्गों में आप /**private*/ __foo() {इसे कुछ अतिरिक्त भार देने के लिए देखेंगे ।

मैंने कभी भी अपने सभी तरीकों को अंडरस्कोर के साथ विकसित करने वाले डेवलपर्स के बारे में नहीं सुना है, इसलिए मैं यह बताना शुरू नहीं कर सकता कि क्या कारण हैं।


12
मैं अपने नियंत्रकों में उन तरीकों से पहले एक अंडरस्कोर रखता हूं जो कक्षा में निजी हैं, और रूटिंग में अप्रयुक्त हैं। क्योंकि मैं अपने स्वयं के ढांचे के साथ काम करता हूं, यह सुरक्षा जोड़ता है क्योंकि मैं मार्गों में नियंत्रक नामों पर कोई अग्रणी अंडरस्कोर की नीति लागू नहीं करता है। लेकिन यह शायद ही कभी प्रति नियंत्रक 1-2 तरीकों से अधिक है।
रॉबर्ट के

6
परंपरा के अनुसार, पर्ल के साथ, एक अंडरस्कोर के साथ शुरू होने वाली विधि निजी है। लेकिन यह केवल एक सम्मेलन है। वास्तव में, ये विधियाँ अभी भी कक्षा के बाहर से सुलभ हैं।
लुक एम

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

जोहान - refactoring एक उपद्रव है? मेरे संपादक में "फाइंड एंड रिप्लेस" नामक एक फीचर है। बहुत अच्छा काम करता है!
डेवलेले

यह एक C # सम्मेलन है जिसका उपयोग आप निजी सदस्यों को ठीक एक अंडरस्कोर के साथ करने के लिए कर सकते हैं। इसलिए यह उसी तरह से करने के लिए एक Zend फ्रेमवर्क 1 (2012) सम्मेलन था।
अल्फाम 8

73

मेरा मानना ​​है कि PHP के लिए इस तरह के सम्मेलनों के लिए सबसे आधिकारिक स्रोत अभी PSR-2 होगा: कोडिंग स्टाइल गाइड क्योंकि Zend फ्रेमवर्क PSR का हिस्सा है :

संरक्षित या निजी दृश्यता को इंगित करने के लिए संपत्ति के नाम को एकल अंडरस्कोर के साथ उपसर्ग नहीं किया जाना चाहिए।


9
नामकरण सम्मेलन का उपयोग करना एक भाषा से प्यार करने का कारण नहीं है, मुझे लगता है।
सेफ़र

4
जब मैंने पहली बार इस बारे में पढ़ा, तो मैंने इसके होने का कारण समझ लिया ताकि आप किसी विधि को देख सकें और जान सकें कि यह सार्वजनिक है या निजी है। अगर यह एक सम्मेलन की बजाय आवश्यकता होती तो पूरी तरह से अधिक अर्थपूर्ण होता। क्योंकि अगर एक टीम पर 1 प्रोग्रामर एक अंडरस्कोर जोड़ता है जहां अनावश्यक है, या एक अंडरस्कोर के साथ सार्वजनिक करता है, तो आप पूरी तरह से भ्रम की स्थिति में रहते हैं। जैसा कि यह पता चला है, यह PHP4 से आया जेरेमी बताते हैं, और #ZF ने PEAR सम्मेलन के अपने सम्मेलन को आधारित किया। PEAR ने इसे हटा दिया है और मुझे विश्वास है कि #ZF सूट का पालन करेगा।
जॉयडेवन

यह उत्तर सही है। यह मैजेंटो में लानत जगह पर है, और जैसा कि नीचे सलीक द्वारा दिया गया है, यह एक सम्मेलन है जिसे आम तौर पर हटा दिया गया है।
सिलिकॉनक्रॉस्टर

इस बारे में अद्यतन लिंक यहाँ दिया गया है। फ्रेमवर्क
.zend.com

FYI (और @joedevon) Zend 2.4 कुछ महीने पहले जारी किया गया था, और वे अभी भी निजी और संरक्षित ढांचे के लिए अंडरस्कोर का उपयोग करते हैं । zend.com/manual/current/en/ref/… ।
जेम्स

40

अब, 2013 में, यह PSR-2 कोडिंग दिशानिर्देश द्वारा "आधिकारिक तौर पर" खराब शैली है:

संपत्ति के नाम संरक्षित या निजी दृश्यता को इंगित करने के लिए एकल अंडरस्कोर के साथ उपसर्ग नहीं किया जाना चाहिए

स्रोत: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md


6
अनुसार PSR-2-> "SHOULD NOT" का अर्थ है "NOT RECOMMEND" निषिद्ध नहीं। कुछ मामलों में इसका मतलब स्वीकार्य हो सकता है। PSR डॉक्टर -> ietf.org/rfc/rfc2119.txt
अहमद hamdy

14

मैं अंडरस्कोर के साथ निजी / संरक्षित तरीकों को उपसर्ग करने के सख्त खिलाफ था क्योंकि आप उसके लिए निजी / संरक्षित कीवर्ड का उपयोग कर सकते हैं और आईडीई इसे आपके लिए चिह्नित करेगा।

और मैं अभी भी हूं, लेकिन, मुझे एक कारण मिला कि यह एक अच्छा अभ्यास क्यों हो सकता है। कल्पना करें कि आपके पास सार्वजनिक विधि है addFoo()और उस विधि के अंदर आपके पास कुछ कार्य है जो अन्य विधियों के साथ सामान्य है addFooWhenBar(), addFooWhenBaz()... अब, उस सामान्य विधि का सबसे अच्छा नाम होगा addFoo(), लेकिन यह पहले से ही लिया गया है, इसलिए आपको कुछ के साथ आना होगा बदसूरत नाम जैसे addFooInternal()या addFooCommon()... लेकिन _addFoo()निजी तरीका सबसे अच्छा लगता है।


हाँ, सहमत हैं। मैं वास्तव में यह देखने के लिए यहां आया था कि दूसरों ने अंडरस्कोर के बारे में क्या सोचा क्योंकि मैंने केवल उनका उपयोग शायद ही कभी किया है, और यह हमेशा गलत लगता है, लेकिन यह उदाहरण एक बार मेरे पास है। मैंने उन्हें टेम्पलेट विधि पैटर्न के कुछ मामलों के लिए भी उपयोग किया है, जहां एक सार्वजनिक पद्धति अमूर्त संरक्षित विधियों पर कॉल करती है जिन्हें बच्चों ने ओवरराइड किया है, जो एक समान विचार है। कभी-कभी एक सार्वजनिक विधि और एक अमूर्त संरक्षित पद्धति जिसे वह कहते हैं, एक समान या संबंधित है कि उनका नामकरण अलग-अलग करने के लिए सिर्फ एक _ से उपसर्ग की तुलना में अजीब लगता है।
जॉन पैनोसैस्ट

12

अग्रणी अंडरस्कोर आमतौर पर निजी गुणों और विधियों के लिए उपयोग किया जाता है । ऐसी तकनीक नहीं जिसे मैं आमतौर पर नियोजित करता हूं, लेकिन कुछ प्रोग्रामर के बीच लोकप्रिय रहता है।


10

मैं निजी विधियों के लिए लिखने वाली PHP 5 कक्षा में एक प्रमुख अंडरस्कोर का उपयोग करता हूं। यह डेवलपर के लिए एक छोटा दृश्य क्यू है जो एक विशेष वर्ग का सदस्य निजी है। आईडीई का उपयोग करते समय इस प्रकार का संकेत उतना उपयोगी नहीं है जो आपके लिए सार्वजनिक और निजी सदस्यों को अलग करता है। मैंने इसे अपने C # दिनों से उठाया। पुरानी आदतें...


5

मेरा मानना ​​है कि आपकी मूल धारणा सही थी, मैंने पाया है कि कुछ भाषाओं के लिए कुछ ऐसे तरीकों के लिए एक सामान्य अभ्यास होना चाहिए जो उन तरीकों / सदस्यों आदि के लिए एक अंडरस्कोर उपसर्ग करते हैं जिन्हें "ऑब्जेक्ट" के लिए निजी रखा जाना है। सिर्फ कहने के लिए एक दृश्य तरीका है, हालांकि, आप इसे कॉल नहीं किया जाना चाहिए!


5

मैं उसी उत्तर की तलाश में था, मैंने कुछ शोध किया, और मैंने अभी-अभी पता लगाया है कि php चौखटे अलग-अलग शैलियों का सुझाव देते हैं:

कोड इग्नाइटर

आधिकारिक मैनुअल में एक कोडिंग शैली अनुभाग है जो इस अभ्यास को प्रोत्साहित करता है :

निजी तरीके और चर

ऐसे तरीके और चर जो केवल आंतरिक रूप से एक्सेस किए जाते हैं, जैसे कि उपयोगिता और सहायक कार्य जो आपके सार्वजनिक तरीके कोड एब्स्ट्रक्शन के लिए उपयोग करते हैं, उन्हें अंडरस्कोर के साथ उपसर्ग किया जाना चाहिए।

public function convert_text()

private function _convert_text()

अन्य चौखटे भी ऐसा ही करते हैं

CakePHP:

वही करता है :

सदस्य दृश्यता

विधियों और चरों के लिए PHP5 के निजी और संरक्षित कीवर्ड का उपयोग करें। इसके अतिरिक्त, गैर-सार्वजनिक विधि या चर नाम एकल अंडरस्कोर (_) से शुरू होते हैं। उदाहरण:

class A
{
    protected $_iAmAProtectedVariable;

    protected function _iAmAProtectedMethod()
    {
       /* ... */
    }

    private $_iAmAPrivateVariable;

    private function _iAmAPrivateMethod()
    {
        /* ... */
    }
}

और भी

नाशपाती

वही करता है :

निजी वर्ग के सदस्य एकल अंडरस्कोर से पहले होते हैं। उदाहरण के लिए:

$_status    _sort()     _initTree()

जबकि

Drupal

कोड शैली विशेष रूप से इसके खिलाफ चेतावनी देती है :

  1. संरक्षित या निजी गुणों और विधियों को अंडरस्कोर उपसर्ग का उपयोग नहीं करना चाहिए।

स्वर की समता

दूसरी ओर, घोषणा करता है :

सिम्फनी PSR-0, PSR-1, PSR-2 और PSR-4 दस्तावेजों में परिभाषित मानकों का पालन करता है।


बहुत गहन उत्तर।
कर्नलक्लिक

4

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

मुझे नहीं पता कि यह अभी भी अजगर में उपयोग करने के लिए सम्मेलन है, हालांकि


3

Drupal (a php CMS) में अंडरस्कोर का उपयोग हुक को रोकने के लिए किया जा सकता है ( https://api.drupal.org/api/drupal/includes -module.inc/group/hooket/7 )!

अगर मेरे पास "my_module" नामक एक मॉड्यूल है और एक फ़ंक्शन my_module_insert नाम देना चाहता है, तो यह फ़ंक्शन हुक_इन्टर पर "हुक" करेगा। यह रोकने के लिए कि मैं अपने फ़ंक्शन का नाम बदलकर _my_module_insert कर सकता हूं।

ps जिस तरह से Drupal में हुक काम करते हैं, गलती से हुक को लागू करना संभव है, जो बहुत बुरा है।


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

3

Drupal, और अंडरस्कोर का उपयोग करना:

एक सामान्य तरीके से अंडरस्कोर इस तथ्य को सरल रूप से चिह्नित करना है कि एक फ़ंक्शन केवल एक संबंधित माता-पिता फ़ंक्शन द्वारा बुलाया जाएगा ...

function mymodule_tool($sting="page title"){
    $out ='';
    //do stuff 
    $out  .= _mymodule_tool_decor($sting);
    return $out;
}

function _mymodule_tool_decor($sting){
    return '<h1>'.$string.'</h1>';
}

बेशक, सिर्फ एक सरल उदाहरण ...


0

केवल इस उद्देश्य को याद रखने के लिए अंडरस्कोर का उपयोग करना कि हम कक्षा के बाहर '' वेरिएबल को संशोधित नहीं करेंगे ''।

जैसा कि हम सभी अपरकेस में कॉन्स्टेबल वैरिएबल की घोषणा करते हैं ताकि वेरिएबल के नाम को देखकर अंदाजा लगा सके कि यह एक कॉन्स्टेबल वेरिएबल है। वैसा ही जैसा कि हम कक्षा के बाहर संशोधित नहीं करना चाहते हैं, हम इसे अपने स्वयं के सम्मेलन के लिए अंडरस्कोर के साथ घोषित करते हैं।


"कॉन्स्टेबल वैरिएबल" से आपका क्या तात्पर्य है? आप एक स्थिरांक को कैसे परिभाषित कर सकते हैं जो परिवर्तनशील हो?
निको हासे

-21

उन्हें "जादू के तरीके" कहा जाता है ।


39
_foo()एक एकल प्रमुख अंडरस्कोर के साथ एक जादू की विधि नहीं है। जादू के तरीकों को दो लगातार अग्रणी अंडरस्कोर द्वारा दर्शाया जाता है । यहाँ सवाल केवल एक के बारे में बात करता है।
BoltClock
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.