Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Tools & Tips

PSR-ओह!

by
Read Time:8 minsLanguages:

Hindi (हिंदी) translation by Ashish Rampal (you can also view the original English article)

Nettuts+ पर पिछले लेसन में, आपने PSR के बारे में जाना; हालांकि, उस आर्टिकल ने आपके प्रोजेक्ट्स में कोडिंग स्टाइल को इंटीग्रेट करने की प्रक्रिया को विस्तार से नहीं बताया। आइए इसे ठीक करें!

नोट: यह आर्टिकल मानता है कि आपने PSR-Huh? पढ़ा है, और समझें कि PSR क्या रेफेर करता है। आइए पहले स्टैण्डर्ड से शुरू करें: PSR-0।


PSR-0 - ऑटोलोडिंग स्टैण्डर्ड

PHPCS प्लगइन मेरे द्वारा उपयोग किया गया सबसे उपयोगी टूल है।

अतीत में, हमने PHP फ़ाइलों को दो तरीकों से एक में शामिल किया था:

  • प्रत्येक फ़ाइल के शीर्ष पर स्टेटमेंट्स को शामिल करने के विशाल ब्लॉक का उपयोग करना।
  • सभी को एक फ़ाइल में शामिल करें और अपनी प्रोजेक्ट के भीतर उस सिंगल फ़ाइल को शामिल करें।

इन दोनों दृष्टिकोणों में अपने अपने फायदे और नुक्सान हैं, लेकिन, मुझे लगता है कि हम सभी सहमत हैं कि न तो ऑप्टीमल है और न ही आधुनिक समाधान हैं। PHP5 ने अपने क्लास के नामों के आधार पर ऑटोलोडिंग फ़ाइलों की अवधारणा पेश की; इसलिए, PSR-0 का उद्देश्य फाइल के नामों को कंसिस्टेंट रखना है।

नेमस्पेस का फ़ाइल के नाम या ऑटोलोडिंग के साथ कुछ लेना देना नहीं है; आप तकनीकी रूप से एक ही फ़ाइल में अलग-अलग नेमस्पेस घोषित कर सकते हैं। उदाहरण के लिए, निम्नलिखित कोड पूरी तरह मान्य है।

इस सिंगल फ़ाइल में दो Hello क्लासेस हैं, लेकिन वे अलग-अलग नेमस्पेस में रहती हैं। इस कोड की अंतिम दो पंक्तियां Hello() क्लासेज को उनके संबंधित नेमस्पेस पर तुरंत इंस्टनशियेट करती हैं। पहला आउटपुट "Nettuts+", जबकि दूसरा "Gabriel" को echo करता है। नेमस्पेस आपको एक ही नाम के साथ दो क्लासेज के बीच अंतर करने की अनुमति देता है, जैसा कि आप अपने डेस्कटॉप पर फ़ोल्डर्स के साथ इस्तेमाल कर सकते हैं। PSR-0 स्टैण्डर्ड बस नेमस्पेस के लाभों का लाभ उठाता है, जिससे आपके क्लासेज को ऑटो लोड करना आसान हो जाता है। अपनी फ़ाइलों का लगातार नामकरण करके, आप एक ऐसा फ़ंक्शन बना सकते हैं जो आवश्यक फ़ाइलों को आटोमेटिक रूप से ढूंढता हो।

PSR-1 अनुपालन करने के लिए, आपको भी PSR-0 को फॉलो करना होगा।

पूर्ण स्टैण्डर्ड को पढ़ना सुनिश्चित करें, लेकिन संक्षेप में:

  • प्रत्येक क्लास को प्रोजेक्ट (या निर्माता) नाम के साथ नामित किया जाना चाहिए।
  • क्लास के नाम के नीचे अंडरस्कोर डायरेक्टरी विभाजक में परिवर्तित किया जाना चाहिए।
  • फ़ाइलों में .php एक्सटेंशन होना चाहिए।

उदाहरण के लिए, एक क्लास रिफरेन्स:

यदि PSR-0 को फॉलो करना है, तो इस पाथ में ट्रांसलेट करना चाहिए:

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

एक PSR-0 कॉम्पलिएंट लोडर आपको बेस पाथ निर्दिष्ट करने की अनुमति देता है, लोडर को सूचित करता है कि कौन सी डायरेक्टरी पहले दिखानी है। प्रारंभ करने के लिए, एक सरल composer.json फ़ाइल बनाएं जिसमें निम्न JSON शामिल हो:

यह JSON फ़ाइल कंपोज़र को बताती है कि हम बेस पाथ के रूप में वर्तमान डायरेक्टरी (रूट फ़ोल्डर) के साथ सभी Nettuts-namespaced फ़ाइलों को ऑटो लोड करने के लिए PSR-0 स्टैण्डर्ड का उपयोग करना चाहते हैं। हम vendor फ़ोल्डर (उदा ./vendor/Gmanricks/ClassName) के सापेक्ष, Gmanricks नेमस्पेस के साथ सभी क्लासेज को ऑटो लोड करना चाहते हैं।

अब, ऑटो लोड क्लासेज को पुन: जेनेरेट करने के लिए बाद के एडिट पर ऑटो लोड क्लासेज, या "composer dump-autoload" जेनेरेट करने के लिए "composer install" टाइप करें। साथ ही, अपने प्रोजेक्ट में जल्दी ही कहीं ऑटोलोडर को require करना मत भूलना।

कंपोजर आपका सबसे अच्छा ऑप्शन है, लेकिन जब आप एक छोटा, सरल ऑटोलोडर चाहते हैं तो अलग परिदृश्य (scenario) भी हो सकते हैं। PHP-FIG एक सैंपल ऑटोलोडर प्रदान करता है जिसका आप उपयोग कर सकते हैं:

यह ध्यान रखना महत्वपूर्ण है कि यह लोडर वर्तमान डायरेक्टरी में PSR स्टैण्डर्ड का उपयोग कर सभी क्लासेज को लोड करने का प्रयास करता है।

अब जब हम सफलतापूर्वक क्लासेज को ऑटो लोड कर रहे हैं, तो चलिए अगले स्टैण्डर्ड पर जाएं: बेसिक कोडिंग स्टैण्डर्ड।


PSR-1 - बेसिक कोडिंग स्टैंडर्ड

PSR-1 सामान्य कोडिंग गाइडलाइन को परिभाषित करता है, जिसे दो भागों में विभाजित किया जा सकता है।

नेमिंग कन्वेंशन

नेमस्पेस आपको एक ही नाम के साथ दो क्लासेज के बीच अंतर करने की अनुमति देता है।

किसी भी प्रोग्रामिंग भाषा के साथ, नीचे दिए गए नेमिंग कन्वेंशन अंततः आपके कोड को पढ़ने और बनाए रखने में आसान बनाता है। फॉलो करने के लिए यहां कुछ नियम दिए गए हैं:

  • क्लास के नाम PascalCase का उपयोग करते हैं।
  • मेथड के नाम camelCase में होने चाहिए।
  • कांस्टेंट को सभी कैपिटल अक्षरों की आवश्यकता होती है, प्रत्येक शब्द को अंडरस्कोर से अलग करते हैं (उदाहरण. CONSTANT_VARIABLE)।

कोड कन्वेंशन:

नेमिंग कन्वेंशन करने से अधिक भी बहुत कुछ है; इन गाइडलाइन्स का भी पालन करें:

  • केवल अपने कोड में  <?php या <?= का उपयोग करें। एक क्लास के भीतर PHP को बंद मत करो।
  • फ़ाइलों को या तो सिंबल को घोषित करना चाहिए या उनका उपयोग करना चाहिए।
  • फ़ाइलों को PHP कोड के लिए BOM के बिना UTF-8 फॉर्मेट में होना चाहिए।

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

यह उल्लेखनीय है कि प्रत्येक PSR स्टैण्डर्ड पिछले PSR स्टैण्डर्ड पर बनता है। ऐसे में, PSR-1 कॉम्पलिएंट होने के लिए, आपको भी PSR-0 का पालन करना होगा। इन दो स्टैंडर्ड्स का पालन करके, आपके कोड को ठीक से नेमस्पेस और ऑटोलोड किया जाएगा। वास्तव में उनका फॉलो न करने का कोई कारण नहीं है।

हां, कुछ डेवलपर्स PSR के बारे में शिकायत करते हैं और अन्य कन्वेंशन का पालन करना पसंद करते हैं, लेकिन इस स्टैण्डर्ड का पालन करके, आप अपनी कंसिस्टेंसी के बारे में चिंता किए बिना सभी के साथ कोड को साझा कर सकते हैं। ऐसा कहकर, कोई भी यहां आपको मजबूर नहीं कर रहा है। यह बस एक रेकमेंड की गयी गाइडलाइन है।

अगला स्टैण्डर्ड, PSR-2, इस बात को निर्दिष्ट करता है कि आपको अपना कोड कैसे व्यवस्थित करना चाहिए।


PSR-2 - एडवांस कोडिंग स्टैण्डर्ड

PSR-2 आपके स्पेसिफिक के बारे में बताते हैं कि आपको अपना कोड कैसे बनाना चाहिए।

इसके बाद, हम उस स्टैण्डर्ड पर आये हैं कि PHP डेवलपर्स सबसे अधिक संघर्ष करते हैं; असल में, यही कारण है कि मैंने इस आर्टिकल को लिखना चुना।

PSR-2 कई नियमों को परिभाषित करता है, जिनमें से कई नीचे सूचीबद्ध हैं:

  • टैब के बजाय चार रिक्त स्थान का उपयोग किया जाना चाहिए।
  • आइडियल लाइन की लंबाई 80 करैक्टर से कम होनी चाहिए, लेकिन सभी लाइन्स पर 120 अक्षरों की सॉफ्ट लिमिट लगाई जानी चाहिए।
  • namespace और use डेक्लरैक्टर के नीचे एक खाली लाइन का उपयोग करना चाहिए।
  • एक मेथड या क्लास के शुरुआत वाले ब्रेस (opening brace) अपनी लाइन पर होने चाहिए।
  • एक मेथड या क्लास के बंद वाले ब्रेस (closing brace) बॉडी के तुरंत बाद लाइन पर जाना चाहिए।
  • सभी प्रॉपर्टीज और मेथड्स को विजिबिलिटी लेवल की आवश्यकता होती है।
  • 'abstract' / 'final' कीवर्ड विजिबिलिटी से पहले उपस्थित होना चाहिए जबकि 'static' इसके बाद लगाया जाता है।
  • कण्ट्रोल स्ट्रक्चर कीवर्ड एक स्थान के बाद लगाया जाना चाहिए।
  • कंट्रोल स्टेटमेंट के ओपनिंग ब्रेस स्टेटमेंट वाली लाइन पर ही दिखाई देना चाहिए।

एक पूर्ण ओवरव्यू के लिए पूरे spec को देखना सुनिश्चित करें।

PSR-2 PSR-1 (और PSR-0) जितना ही महत्वपूर्ण है। ये कोड को पढ़ने और बनाए रखने में आसान बनाना चाहते है। लेकिन, जैसा कि वे कहते हैं, "The devil is in the details" याद रखने के लिए बहुत साड़ी डिटेल्स हैं, जो आपके प्रोग्रामिंग आदतों का स्टैण्डर्ड परिभाषित करने से अलग होने पर मुश्किल हो सकती है। शुक्र है, अगर आप बोर्ड पर हैं, तो ऐसे टूल हैं जो आपको PSR-0, PSR-1 और PSR-2 का पालन करने में मदद करते हैं। शायद सबसे अच्छा टूल Sublime Text का प्लगइन, PHPCS है।


PHPCS - PHP कोड स्निफर

जब कोड शेप को प्राप्त करने की बात आती है तो PHPCS प्लगइन सबसे उपयोगी टूल है जिसका उपयोग मैंने किया है। यह आपको न केवल यह सुनिश्चित करने की अनुमति देता है कि आपका कोड PSR मानकों का पालन करता है, लेकिन यह सिंटेक्स के एरर की जांच के लिए PHP के linter का भी उपयोग करता है। यह एक अच्छा ख़ासा समय बचाने वाला है; जब आप ब्राउज़र में अपने कोड का परीक्षण करते हैं तो आपको अब सिंटेक्स एरर के बारे में चिंता करने की ज़रूरत नहीं है।

Sublime Package Control (इसे Phpcs कहा जाता है) के माध्यम से पैकेज को इंस्टॉल करें, या वैकल्पिक रूप से, Git के साथ, निम्न कमांड्स का उपयोग करके:

यह प्लगइन इनस्टॉल करता है, लेकिन आप PHPCS को कॉन्फ़िगर करने से पहले कुछ डेपेंडेन्सीज़ की आवश्यकता है। एक बार फिर, उन्हें इनस्टॉल करने का सबसे आसान तरीका कंपोजर के साथ है। अपनी पसंद की डायरेक्टरी में ब्राउज़ करें और निम्न JSON के साथ एक composer.json फ़ाइल बनाएं:

यह तीन डेपेंडेन्सीज़ को वर्तमान फ़ोल्डर में इनस्टॉल करता है। टर्मिनल विंडो को अपने इंस्टॉलेशन लोकेशन पर खोलें और composer install type करें, और यह आवश्यक पैकेज डाउनलोड करेगा।

अब आप Sublime Text में प्लगइन को कॉन्फ़िगर कर सकते हैं। 'Preferences' > 'Package Settings' > 'PHP Code Sniffer' > 'Settings - User' पर नेविगेट करें।

PHP Code-sniffer SettingsPHP Code-sniffer SettingsPHP Code-sniffer Settings

प्लगइन को यह जानने की जरूरत है कि तीन डेपेंडेन्सीज़ कहां रहती हैं, साथ ही स्टैण्डर्ड जो हम चाहते हैं कि हमारा कोड पालन करे:

ये सेटिंग्स PHPCS को सूचित करती हैं कि हम PSR 2 स्टैण्डर्ड का पालन करना चाहते हैं और प्रत्येक डिपेंडेंसी के पाथ को प्रदान करना चाहते हैं। अपने वास्तविक पाथ के साथ DEPENDENCY_PATH को रीप्लेस करना न भूलें।

Sublime को रीस्टार्ट करें, और जब आप अपनी PHP फ़ाइलों को सेव करते हैं तो कोड स्निफर आपके कोड को स्कैन करेगा।

Phpcs Sublime Extension ErrorsPhpcs Sublime Extension ErrorsPhpcs Sublime Extension Errors

एडिटर में राइट-क्लिक करने से कई नए ऑप्शन भी सूचीबद्ध होंगे, जैसे एरर मार्क्स को साफ़ करना और नॉन-स्टैण्डर्ड इशू को ठीक करने का प्रयास करना। हालांकि, इस आर्टिकल का पॉइंट आपको स्टैण्डर्ड के लिए उपयोग करना सिखाना है, मैं सुझाव देता हूं कि मैन्युअल रूप से आपके कोड को ठीक करना और आटोमेटिक fixer फीचर से परहेज करना।


निष्कर्ष

PSR स्टैंडर्ड्स को बनाया गया ताकि कोड स्टाइल स्थिरता पर सैक्रिफाइस किये बिना कोड को प्रोजेक्ट दर प्रोजेक्ट आसानी से पुन: उपयोग किया जा सके। हालांकि वे पहली बार जबरदस्त महसूस कर सकते हैं, आप इस आर्टिकल से आईडिया और टूल्स का उपयोग कर ट्रांजीशन में मदद के लिए कर सकते हैं।

अंतिम बार दोहराने के लिए: कोई भी आपको PHP में कोड के तरीके को बदलने के लिए मजबूर नहीं कर रहा है। यह केवल एक गाइड है, मूल रूप से फ्रेमवर्क के अंतःक्रियाशीलता (interoperability) के लिए है। यह कहता है, Nettuts+ पर, हम इसे पालन करने का सबसे अच्छा अभ्यास मानते हैं। अब अपना मन बनाओ! यदि आपके कोई प्रश्न हैं, तो उसे नीचे सुनें!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.