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

PHP में जितनी जल्दी हो सके OOP सीखना

by
Difficulty:IntermediateLength:LongLanguages:

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

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




OOP क्या है?

OOP का अर्थ है Object Oriented Programming। OOP एक प्रोग्रामिंग प्रतिमान (paradigm) है जिसमें आप काम करने के लिए "ऑब्जेक्ट्स" बनाते हैं। इन ऑब्जेक्ट्स को आपकी विशिष्ट जरूरतों के अनुरूप बना सकते है, ताकि एक ही कोड के आधार को बनाए रखते हुए विभिन्न प्रकार की ऍप्लिकेशन्स को सर्व (serve) कर सकें। वास्तव में बहुत उपयोगी है।

एक OBJECT क्या है?

OBJECT केवल "CLASS" की एक नकल या इंस्टैंस (instance) है। एक class को "ब्लैक बॉक्स" के रूप में समझा जा सकता है जहां से हम अपने ऑब्जेक्ट को बनाते हैं और इसके ऐट्रिब्यूट्स (वेरिएबल्स ) और मेथड्स (फंक्शन्स) का उपयोग करते हैं। क्लास और OOP समझाते समय दिया जाने वाला सबसे आम तुलना यह है कि आप कार कैसे चलाते हैं: मूलतः, आपके पास 2 या 3 पैडल, एक गियर स्टिक और एक स्टीयरिंग व्हील होता है। जब आप पैडल दबाते हैं तो कार को कैसे काम करती है, यह जानने की आपको जरूरत (और शायद इच्छा) नहीं है। आप बस अपनी कार को आगे और पीछे, बांयें और दाएं ही करना चाहते हैं। और OOP ठीक यही है। आपको यह जानने की ज़रूरत नहीं है कि क्लास में मेथड कैसे काम करते हैं (यदि आपने इसे खुद ही इम्प्लीमेंट नहीं किया है), बस यह जाने की वे क्या करते हैं। OOP तब भी उपयोगी हो सकते हैं जब आपके सिस्टम में एक ही प्रकार के ऑब्जेक्ट्स की एक बड़ी संख्या हो: आपको बस ऑब्जेक्ट्स को बनाना होगा और फिर उन्हें किसी भी कोड को फिर से लिखे बिना उसी तरह मैनिपुलेट करना होगा। इसके अलावा, एक ऑब्जेक्ट प्रोग्राम के एक्सेक्यूशन के दौरान इसके स्टेट (वैरिएबल वैल्यू और ऐसे ही) को बनाए रखने में सक्षम है।

"कार" का इम्प्लीमेंटेशन हमसे छिपा हुआ है, हालांकि हम अपनी पूर्ण क्षमताओं का उपयोग कर सकते हैं।

PHP में OOP

PHP 5 (हालांकि इस आर्टिकल में अधिकांश विचार PHP 4 पर भी लागू होते हैं) easy class के निर्माण को देकर ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के लिए अच्छा सपोर्ट देता है। PHP वो सभी चीजे देती है जो अन्य "true" OOP लैंग्वेज में होती है (उदाहरण के लिए Python और JAVA), जैसे कि inheritance, polymorphism और encapsulation।

Inheritance

इनहेरिटेंस के पीछे मूल विचार यह है कि एक जैसे ऑब्जेक्ट्स एक सामान प्रॉपर्टीज को साझा करते हैं। तो एक "generic" क्लास बनाकर, हमारी उसके बाद वाली क्लासेज को बनाने के लिए हम एक खाका तैयार कर सकते हैं। कल्पना कीजिए, यदि आप करें, तो कार की प्रॉपर्टीज: रंग, पहियों की संख्या, हार्सपावर, सीटों की संख्या आदि। इस टेम्पलेट के साथ हम इस क्लास को एक्सटेंड करके इसे अपनी कारों का विशेषज्ञ बना सकते हैं: एक रेसिंग कार बनाये जिसकी "nitro" प्रॉपर्टी है, या "trailer" प्रॉपर्टी वाला ट्रक। अंतिम बात यह है: अधिक जेनेरिक क्लास बनाये जिसमें अधिकांश सामान्य ऐट्रिब्यूट्स होते हैं और इससे आपके पास अन्य ऑब्जेक्ट्स को बनाने में आपको बहुत कम काम करना होगा, इन्हे केवल थोड़ा सा अलग करना होगा। पूरे कोड को दोबारा लिखने के बजाय, आप इसकी प्रॉपर्टीज को एक्सटेंड करते हैं, इससे प्रक्रिया में बहुत समय बचाते हैं।

हमारी कार क्लास के लिए इनहेरिटेंस डायग्राम।

encapsulation

जैसा कि पहले समझाया गया, ऑब्जेक्ट्स का उपयोग करने के मुख्य लाभों में से एक यह है कि हमें उसके सभी सदस्यों (ऐट्रिब्यूट्स या फंक्शन्स) को प्रकट करने की आवश्यकता नहीं है; बस इसके साथ काम करने के लिए आवश्यक इंटरफेस। इन ऑब्जेक्ट के प्रयोग के लिए डिटेल्स उपयोगी नहीं होती, इन्हे शेष ऑब्जेक्ट्स से छिपाया जाना चाहिए। इसे ही encapsulation कहा जाता है।

विजिबिलिटी का स्तर

  • public: इसका अर्थ है कि एक क्लास का मेंबर्स सभी के द्वारा विज़िबल और प्रयोग करने योग्य / मॉडिफाई करने योग्य होता है
  • private: इसका मतलब है कि क्लास मेंबर्स केवल क्लास के द्वारा उपयोग करने योग्य / मॉडिफाई करने योग्य है
  • protected: इसका मतलब है कि क्लास मेंबर्स केवल सिर्फ खुद की क्लास में प्रयोग करने योग्य / मॉडिफाई करने योग्य होते हैं और अंततः अपनी sub-classes में

नोट: डिफ़ॉल्ट रूप से, PHP में, क्लास मेंबर पब्लिक होते हैं तब तक जब तक की उन्हें प्राइवेट या प्रोटेक्टेड ना बनाया जाए। यहाँ एक उदाहरण देखें।

Polymorphism

पॉलीमॉर्फिज़्म OOP की एक विशेषता है जो प्रोग्रामर को अलग-अलग संदर्भों में अलग अर्थ या उपयोग प्रदान करने की अनुमति देता है - विशेष रूप से, किसी क्लास के मेंबर को इसका उपयोग किए जाने वाले संदर्भ के आधार पर विभिन्न कार्यों को करने की अनुमति देने के लिए। कल्पना कीजिए कि आपके पास एक Person क्लास है और Person की दो sub-classes हैं: Japanese और American। दोनों talk() नामक एक फंक्शन को इम्प्लीमेंट करते हैं, लेकिन अलग भाषाओं और सोशल संदर्भ के साथ। और जब वे मूल रूप से People हैं (जैसा कि वे क्लास Person से प्राप्त करते हैं), उनका फ़ंक्शन talk() का इम्प्लीमेंटेशन बहुत अलग है। तो आपके पास मूल रूप से Person के दो ऑब्जेक्ट हैं जिसमें talk() फ़ंक्शन अलग तरीके से काम करता है।

अपने हाथ अब इसमें डालते हैं

ठीक है, अब असली एक्शन के लिए चलें। हम इमेज मैनीपुलेशन और सूचना निष्कर्षण (extraction) को हैंडल करने के लिए एक साधारण क्लास का निर्माण करेंगे। इस ट्यूटोरियल की अवधि के लिए मैं मानता हूँ कि आपके पास PHP (वैरिएबल, फंक्शन बनाने, कंट्रोल फ्लो स्टेटमेंट्स और लूप्स के साथ काम करना) की बुनियादी समझ है। GD PHP manual को पड़ने पर इमेज को हैंडल करने वाले फंक्शन्स के बारे में आपको कोई संदेह होगा तो वह निकल जायेगा।

स्टेप 1: हमारी क्लास बनाना

हम अपनी क्लास को डिफाइन करते हुए शुरू करते हैं:

यह सिर्फ PHP को बताता है कि हम "Image" नामक एक नई क्लास को डिफाइन करेंगे। अब हम क्लास कन्स्ट्रक्टर को डिफाइन करेंगे। एक कन्स्ट्रक्टर केवल एक ऐसा फंक्शन होता है जिसे एक नया ऑब्जेक्ट बनाने के दौरान कॉल किया जाता है। PHP 5 में यह दो अलग-अलग तरीकों से प्राप्त किया जा सकता है: बिलकुल क्लास के नाम का (PHP 4 और आगे) के साथ एक पब्लिक फ़ंक्शन बनाना या "__construct()" (PHP 5 में केवल) नामक फ़ंक्शन बनाकर:

स्टेप 2: क्लास कन्स्ट्रक्टर बनाना

कोड के निम्नलिखित दो टुकड़े बिल्कुल एक ही चीज हैं:

नोट: एक क्लास कन्स्ट्रक्टर हमेशा public होता है।

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

जैसे, हमें जो पहली चीज करनी है वो है इमेज को read करना, चाहे उसका प्रकार कुछ भी हो जो कुछ भी हो। वर्तमान में, GD लाइब्रेरी कई प्रकार के इमेज को सपोर्ट करता है, जैसे कि jpg, png, gif, bmp, और अन्य; हमें सिर्फ इमेज को पढ़ना होगा और उसके प्रकार का पता लगाना होगा।

तो हमने क्या किया है? इमेज को जितना संभव हो सके उतना आसानी से खोलने के लिए, हम उदाहरण के लिए, imagecreatefromjpeg, imagecreatefrompng या imagecreatefromgif के बजाय, हम GD के फ़ंक्शन imagecreatefromstring (जो इनपुट के रूप में डेटा की एक बाइनरी स्ट्रिंग लेता है) का उपयोग करेंगे।

इसलिए हम एक इमेज फ़ाइल खोलने का प्रयास करते हैं और इसके फाइल पॉइंटर को $fp में असाइन करते हैं, और फेल होने पर, प्रोग्राम के एक्सेक्यूशन को समाप्त कर देते हैं।

इसके बाद, हम अपना डेटा रखने के लिए एक खाली स्ट्रिंग बनाते हैं ...

...और पूरी फाइल को पड़े, हमारी नई बनाई गई स्ट्रिंग कंटेंट के साथ रीड किये हुए डाटा को जोड़े।

अब हमे अभी रीड किये हुए डाटा के साथ अपनी इमेज बनानी है...

...और इन सभी फंक्शन्स का उपयोग करने के लिए एक ऑब्जेक्ट बनाएं।

नोट: jpg, png, gif और अधिकांश इमेज फ़ाइलों को बाइनरी मोड में पढ़ने की पड़ा जाता है, इसलिए "rb" को fopen फ़ंक्शन के दूसरे आर्गुमेंट के रूप में दिया गया है। "r" का मतलब है read-only और "b" का अर्थ है बाइनरी।

स्टेप 3: क्लास के ऐट्रिब्यूट्स और मेथड्स को परिभाषित करना

अपने वर्तमान रूप में हमारी क्लास बहुत उपयोगी नहीं है। इसलिए हम इसे और अधिक उपयोगी बनाने के लिए कुछ ऐट्रिब्यूट्स और मेथड्स को जोड़ देंगे। तो हम 1 से शुरू करेंगे: कुछ आंतरिक वेरिएबल्स को परिभाषित करें (प्रत्येक वेरिएबल के पहले "private" विजिबिलिटी डिक्लेरेशन को ध्यान दें)

और 2: इमेज को प्रदर्शित करने के लिए एक मेथड

इस स्टेप में हमने ऑब्जेक्ट के डेटा को होल्ड करने के लिए कुछ क्लास के ऐट्रिब्यूट्स (image, width, height और mimetype) को बनाया है। फिर हमने बनाई गई इमेज को हमारे क्लास एट्रिब्यूट $image पर असाइन करने के लिए कुछ मॉडिफिकेशन्स की...

...और हमारे शेष क्लास वेरिएबल्स में इमेज की जानकारी को एक्सट्रेक्ट किया (इमेज जानकारी कैसे पढ़ी जाती है को पूरी तरह से समझने के लिए getimagesize पर डॉक्यूमेंटेशन पढ़ें):

इसके बाद हमने एक ऐसा फ़ंक्शन बनाया जो उपयुक्त हैंडर्स को परिभाषित करके ब्राउज़र में इमेज को आउटपुट करता है (यहां http हेडर पर और अधिक पढ़ें) और ओरिजिनल इमेज mimetype पर आधारित इमेज को आउटपुट करने के लिए उपयुक्त फ़ंक्शन (स्विच स्टेटमेंट के साथ) का उपयोग करके (इस ट्यूटोरियल के लिए हम सिर्फ jpg, png और gif को सपोर्ट करेंगे, लेकिन जैसा कि मैंने पहले कहा था, GD अन्य टाइप्स का सपोर्ट भी करता है। अधिक के लिए php डॉक्यूमेंटेशन पढ़ें)।

तो इसमें "$this" क्या है? "$this", PHP में, खुद क्लास को ही रेफेर करता है, और यह क्लास के एट्रिब्यूट्स या फ़ंक्शन को पॉइंट करता है। जैसे, $this->image क्लास के एट्रिब्यूट "$image" पर पॉइंट करता है और $this->image = ... क्लास के ऐट्रिब्यूट्स की वैल्यू को बदलता है। अगर आप $image = ... लिखते हो तो आप सिर्फ "$image" नामक एक नया लोकल वैरिएबल बनाएंगे, जो विशेष रूप से फ़ंक्शन की पूरी अवधि के लिए उपलब्ध होगा। PHP में क्लासेज बनाने पर ध्यान देने के लिए यह मुख्य चीजों में से एक है।

हमारा बहुत उपयोगी नहीं (फिर भी!) डिस्प्ले मेथड।

स्टेप 4: हमारे "थंबनेल" sub-class को परिभाषित करना

अभी हमारी कक्षा बहुत उपयोगी नहीं है। हांलांकि, हम अपनी इमेज को पढ़ जरूर सकते हैं और इसे डिस्प्ले कर सकते हैं, लेकिन बस यही कर सकते है। अब हम अपने थंबनेल बनाने के लिए एक sub-class बनायेंगेI (हमें वास्तव में एक sub-class बनाने की ज़रूरत नहीं है, लेकिन हम ट्यूटोरियल के लिए, इनहेरिटेंस और पॉलीमॉरफिस्म का प्रदर्शन करेंगे)। तो, इनहेरिटेंस को ठीक से काम करने के लिए हमें अपने सुपर-क्लास (Image) की परिभाषा को थोड़ा बदलना होगा। हमें सिर्फ क्लास वेरिएबल्स की विजिबिलिटी को "private" से "protected" में बदलना होगा। और अब हम अपनी सबक्लास के constructor को बनाएंगे।

तो हम यहाँ क्या कर रहे हैं? हमने एक नयी क्लास बनायीं, जो हमारी ओरिजिनल से प्राप्त हुई है, जिसका अर्थ है कि हम अपने सभी public और protected ऐट्रिब्यूट्स और मेथड्स तक पहुंच सकते हैं। हम सुपर-क्लास के कन्स्ट्रक्टर को कॉल करते हैं, जो इमेज को पढ़ने और उसकी जानकारी निकालने के लिए ज़िम्मेदार हैं। sub-class के कंस्ट्रक्टर अपने सुपरक्लास कंस्ट्रक्टर को कॉल नहीं करते हैं इसलिए हमें इसे स्पष्ट रूप से कॉल करने की आवश्यकता है।

अब हम अपने थंबनेल के लिए एक नई इमेज बनाते हैं, चौड़ाई और ऊंचाई के साथ:

थंबनेल बनाने के लिए, ओरिजिनल इमेज को नयी इमेज में रीसैंपल (रीसाइज) करें:

और अंत में फुल साइज इमेज के बजाय थंबनेल को शामिल करने के लिए ओरिजिनल इमेज को मॉडिफाई करें:

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

हमारी पूरी क्लास और संबंधित सब-क्लास

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

  • रोज के वेब डेवलपमेंट टूट्स और आर्टिकल्स के लिए NETTUTS RSS Feed में सब्सक्राइब करें।


Advertisement
Advertisement
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.