PHP में Public, Private, Protected: क्यों इनके बिना आपका कोड अस्त-व्यस्त हो जाएगा?
\n\nकल्पना कीजिए कि आप एक घर बना रहे हैं। इसमें एक मुख्य दरवाज़ा है (जिसमें कोई भी आ सकता है), एक बेडरूम जो ताले से बंद है (सिर्फ परिवार के लिए), और दीवार में एक तिजोरी (जिसकी चाबी सिर्फ आपके पास है)। PHP की ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP) की दुनिया में, ऐसे "दरवाज़ों" और "तालों" को एक्सेस मॉडिफायर (Access Modifiers) कहा जाता है।
\n\nअगर आपने कभी PHP में क्लासेज़ लिखी हैं, तो आपने public, private और protected शब्द ज़रूर देखे होंगे। लेकिन असल में इनका मतलब क्या है? सब कुछ public क्यों नहीं कर देते और चैन से क्यों नहीं बैठ जाते? इसका जवाब सीधा है: इनके बिना आपका कोड एक ऐसे खुले आँगन जैसा हो जाएगा, जहाँ कोई भी स्क्रिप्ट आपके प्रोग्राम के लॉजिक को गलती से तोड़ सकती है।
इस लेख में हम PHP में एक्सेस मॉडिफायर्स को असल उदाहरणों के साथ समझेंगे, उनके बीच का अंतर जानेंगे, और सीखेंगे कि मज़बूत और लचीला कोड बनाने के लिए उनका इस्तेमाल कैसे करें। यह गाइड Stack Overflow के एक लोकप्रिय प्रश्न पर आधारित है और इसे शैक्षिक वेबसाइट pythonlib.ru के लिए तैयार किया गया है।
\n\nएक्सेस मॉडिफायर क्या हैं और इनकी ज़रूरत क्यों है?
\n\nएक्सेस मॉडिफायर वे कीवर्ड हैं जो यह तय करते हैं कि क्लास के प्रॉपर्टीज़ और मेथड्स तक कहाँ से पहुँचा जा सकता है। ये एनकैप्सुलेशन (Encapsulation) की नींव हैं - जो OOP के चार स्तंभों में से एक है। एनकैप्सुलेशन ऑब्जेक्ट की आंतरिक संरचना को छिपाता है और डेटा को गलत उपयोग से बचाता है।
\n\nPHP में तीन स्तर के एक्सेस होते हैं:
\n\n- \n
- Public – सभी के लिए सुलभ (क्लास के अंदर और बाहर दोनों जगह से)। \n
- Private – सिर्फ उसी क्लास के अंदर सुलभ जहाँ इसे डिफाइन किया गया है। \n
- Protected – क्लास के अंदर और उसकी चाइल्ड क्लासेज़ (inheritance) में सुलभ। \n
आइए, प्रैक्टिकल उदाहरणों के साथ हर एक को समझते हैं।
\n\nPublic: "बिना खटखटाए अंदर आइए"
\n\npublic मॉडिफायर सबसे खुला होता है। public घोषित किए गए प्रॉपर्टीज़ और मेथड्स को कहीं से भी पढ़ा और बदला जा सकता है: दूसरी क्लास से, ग्लोबल स्क्रिप्ट से, या कहीं से भी।
<?php\nclass Car {\n public $brand = 'Toyota';\n\n public function honk() {\n return 'Beep!';\n }\n}\n\n$myCar = new Car();\necho $myCar->brand; // Toyota – काम करता है\n$myCar->brand = 'Honda'; // बदल रहे हैं – काम करता है\necho $myCar->honk(); // Beep!\n?>\n\nयह सुविधाजनक लगता है, है ना? लेकिन इसमें एक समस्या है। मान लीजिए कि User क्लास में एक प्रॉपर्टी है public $password। बाहर का कोई भी कोड इसे पढ़ और बदल सकता है। यह सुरक्षा के लिए बहुत बड़ा खतरा है।
कब उपयोग करें: उन मेथड्स के लिए जो क्लास के पब्लिक API का हिस्सा हैं (जैसे getUserName()), या कॉन्स्टेंट के लिए।
Private: "वह तिजोरी जिसे कोई नहीं खोल सकता"
\n\nprivate मॉडिफायर public के बिल्कुल विपरीत है। प्रॉपर्टी या मेथड सिर्फ उसी क्लास के अंदर सुलभ होता है जहाँ इसे डिफाइन किया गया है। यहाँ तक कि चाइल्ड क्लासेज़ (inheritance) भी पैरेंट के private मेंबर्स को नहीं देख सकतीं।
<?php\nclass BankAccount {\n private $balance = 1000;\n\n private function calculateInterest() {\n return $this->balance * 0.05;\n }\n\n public function getBalance() {\n return $this->balance;\n }\n\n public function applyInterest() {\n $this->balance += $this->calculateInterest();\n }\n}\n\n$account = new BankAccount();\n// echo $account->balance; // Error! Cannot access private property\n// echo $account->calculateInterest(); // Error! Cannot access private method\necho $account->getBalance(); // 1000 – काम करता है, क्योंकि method public है\n$account->applyInterest();\necho $account->getBalance(); // 1050\n?>\n\nइस उदाहरण में, $balance और calculateInterest() बाहरी दुनिया से छिपे हुए हैं। हम बैलेंस को सिर्फ पब्लिक मेथड्स getBalance() और applyInterest() के ज़रिए मैनेज कर रहे हैं। इसे ही कहते हैं एनकैप्सुलेशन।