सार्वजनिक, निजी और संरक्षित के बीच अंतर क्या है?


988

और मैं क्यों इस्तेमाल करना चाहिए जब public, privateऔर protectedकार्य करता है और एक वर्ग के अंदर चर? उनके बीच क्या अंतर है?

उदाहरण:

// Public
public $variable;
public function doSomething() {
  // ...
}

// Private
private $variable;
private function doSomething() {
  // ...
}

// Protected
protected $variable;
protected function doSomething() {
  // ...
}

59
मुझे लगता है कि यह सवाल प्रत्येक के उपयोग के व्यावहारिक उदाहरणों के उत्तरों से भी लाभान्वित होगा, बजाय इसके कि प्रत्येक कीवर्ड क्या करता है, की शाब्दिक परिभाषा प्रदान करता है।
मैथ्यू

70
मुझे वास्तव में लगता है कि यह प्रश्न सार्वजनिक होना चाहिए, संरक्षित नहीं होना चाहिए।
dotancohen

जवाबों:


1260

तुम इस्तेमाल:

  • public उस संपत्ति / विधि को कहीं से भी उपलब्ध कराने की गुंजाइश, अन्य वर्गों और वस्तु के उदाहरण।

  • private गुंजाइश जब आप चाहते हैं कि आपकी संपत्ति / विधि केवल अपनी ही कक्षा में दिखाई दे।

  • protected गुंजाइश जब आप अपनी संपत्ति / पद्धति को सभी वर्गों में दिखाई देना चाहते हैं, जो मूल वर्ग सहित वर्तमान वर्ग का विस्तार करते हैं।

अधिक: (व्यापक जानकारी के लिए)


79
protectedजब आप अपने वैरिएबल / फंक्शन को सभी वर्गों में दिखाना चाहते हैं, जो करंट क्लास और उसके पैरेंट क्लास को बढ़ाते हैं
शाहिद

4
@ शहीद - मुझे आपकी बात समझ में नहीं आती। कोई भी वर्ग जो क्लास ए का विस्तार करता है वह भी ए के मूल वर्ग का विस्तार करता है, नहीं?
17

4
@JDelage - कृपया लिंक देखेंhttp://www.php.net/manual/en/language.oop5.visibility.php#109324
शाहिद

4
@Growler वस्तुओं का उपयोग करना क्यों परेशान करता है?
जे

27
@Growler, एक अधिक उपयोगी उत्तर यह होगा कि किसी वस्तु के आंतरिक कामकाज को जितना संभव हो सके उतना छिपाया जाए। इस तरह इसके टूटने की संभावना कम है। यदि आप सब कुछ सार्वजनिक करते हैं, तो एक अन्य प्रोग्रामर एक चर को बदल सकता है जिसे आप अपनी वस्तु के आंतरिक कामकाज के अलावा किसी अन्य चीज से नहीं बदलना चाहते हैं।
साइप्रस में आराम

1174

dd

जनता:

जब आप एक विधि (कार्य) या एक संपत्ति (चर) घोषित करते हैं public, तो उन विधियों और गुणों को निम्न तक पहुँचा जा सकता है:

  • वही वर्ग जिसने इसे घोषित किया था।
  • वे वर्ग जो उपरोक्त घोषित वर्ग को विरासत में देते हैं।
  • इस वर्ग के बाहर का कोई भी विदेशी तत्व भी उन चीजों तक पहुंच सकता है।

उदाहरण:

<?php

class GrandPa
{
    public $name='Mark Henry';  // A public variable
}

class Daddy extends GrandPa // Inherited class
{
    function displayGrandPaName()
    {
        return $this->name; // The public variable will be available to the inherited class
    }

}

// Inherited class Daddy wants to know Grandpas Name
$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'

// Public variables can also be accessed outside of the class!
$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Prints 'Mark Henry'

संरक्षित:

जब आप एक विधि (फ़ंक्शन) या एक संपत्ति (चर) घोषित करते हैं protected, तो उन विधियों और गुणों को एक्सेस किया जा सकता है

  • वही वर्ग जिसने इसे घोषित किया था।
  • वे वर्ग जो उपरोक्त घोषित वर्ग को विरासत में देते हैं।

बाहरी सदस्य उन चरों पर नहीं पहुँच सकते। "आउटसाइडर्स" इस अर्थ में कि वे घोषित वर्ग के वस्तु उदाहरण नहीं हैं

उदाहरण:

<?php

class GrandPa
{
    protected $name = 'Mark Henry';
}

class Daddy extends GrandPa
{
    function displayGrandPaName()
    {
        return $this->name;
    }

}

$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'

$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error

सटीक त्रुटि यह होगी:

PHP घातक त्रुटि: संरक्षित संपत्ति GrandPa :: $ नाम का उपयोग नहीं कर सकता


निजी:

जब आप एक विधि (कार्य) या एक संपत्ति (चर) घोषित करते हैं private, तो उन विधियों और गुणों को निम्न तक पहुँचा जा सकता है:

  • वही वर्ग जिसने इसे घोषित किया था।

बाहरी सदस्य उन चरों पर नहीं पहुँच सकते। बाहरी लोग इस अर्थ में कि वे घोषित वर्ग के वस्तु उदाहरण नहीं हैं और यहां तक ​​कि वे वर्ग जो घोषित वर्ग को प्राप्त करते हैं।

उदाहरण:

<?php

class GrandPa
{
    private $name = 'Mark Henry';
}

class Daddy extends GrandPa
{
    function displayGrandPaName()
    {
        return $this->name;
    }

}

$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Results in a Notice 

$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error

सटीक त्रुटि संदेश होंगे:

सूचना: अपरिभाषित संपत्ति: डैडी :: $ नाम
घातक त्रुटि: निजी संपत्ति का उपयोग नहीं कर सकते ग्रैंडपा :: $ नाम


परावर्तन का उपयोग करते हुए दादाजी वर्ग को अलग करना

यह विषय वास्तव में दायरे से बाहर नहीं है, और मैं इसे केवल यह साबित करने के लिए यहां जोड़ रहा हूं कि प्रतिबिंब वास्तव में शक्तिशाली है। जैसा कि मैंने उपरोक्त तीन उदाहरणों में कहा था, protectedऔर privateसदस्यों (गुणों और विधियों) को कक्षा से बाहर नहीं पहुँचा जा सकता है।

हालाँकि, प्रतिबिंब के साथ आप कक्षा के बाहर भी पहुँच और सदस्यों द्वारा अतिरिक्त-साधारण कर सकते हैं !protectedprivate

खैर, प्रतिबिंब क्या है?

प्रतिबिंब रिवर्स-इंजीनियर कक्षाओं, इंटरफेस, फ़ंक्शन, विधियों और एक्सटेंशन की क्षमता को जोड़ता है। इसके अतिरिक्त, वे कार्यों, कक्षाओं और विधियों के लिए डॉक्स टिप्पणियों को पुनः प्राप्त करने के तरीके प्रदान करते हैं।

प्रस्तावना

हमारे पास एक वर्ग है जिसका नाम है Grandpasऔर कहते हैं कि हमारे पास तीन गुण हैं। आसान समझ के लिए, विचार करें कि नामों के साथ तीन पोप हैं:

  • मार्क हेनरी
  • जॉन क्लैश
  • विल जोन्स

आइए हम उन्हें बनाते हैं ( क्रमशः संशोधक) public, protectedऔर privateक्रमशः। आप अच्छी तरह से जानते हैं कि protectedऔर privateसदस्यों को कक्षा के बाहर पहुँचा नहीं जा सकता है। अब प्रतिबिंब का उपयोग करते हुए कथन का खंडन करते हैं।

कोड

<?php

class GrandPas   // The Grandfather's class
{
    public     $name1 = 'Mark Henry';  // This grandpa is mapped to a public modifier
    protected  $name2 = 'John Clash';  // This grandpa is mapped to a protected  modifier
    private    $name3 = 'Will Jones';  // This grandpa is mapped to a private modifier
}


# Scenario 1: without reflection
$granpaWithoutReflection = new GrandPas;

# Normal looping to print all the members of this class
echo "#Scenario 1: Without reflection<br>";
echo "Printing members the usual way.. (without reflection)<br>";
foreach($granpaWithoutReflection as $k=>$v)
{
    echo "The name of grandpa is $v and he resides in the variable $k<br>";
}

echo "<br>";

#Scenario 2: Using reflection

$granpa = new ReflectionClass('GrandPas'); // Pass the Grandpas class as the input for the Reflection class
$granpaNames=$granpa->getDefaultProperties(); // Gets all the properties of the Grandpas class (Even though it is a protected or private)


echo "#Scenario 2: With reflection<br>";
echo "Printing members the 'reflect' way..<br>";

foreach($granpaNames as $k=>$v)
{
    echo "The name of grandpa is $v and he resides in the variable $k<br>";
}

आउटपुट:

#Scenario 1: Without reflection
Printing members the usual way.. (Without reflection)
The name of grandpa is Mark Henry and he resides in the variable name1

#Scenario 2: With reflection
Printing members the 'reflect' way..
The name of grandpa is Mark Henry and he resides in the variable name1
The name of grandpa is John Clash and he resides in the variable name2
The name of grandpa is Will Jones and he resides in the variable name3

आम गलतफहमी:

कृपया नीचे दिए गए उदाहरण के साथ भ्रमित न करें। जैसा कि आप अभी भी देख सकते हैं, privateऔर protectedसदस्यों को प्रतिबिंब का उपयोग किए बिना कक्षा के बाहर नहीं पहुँचा जा सकता है

<?php

class GrandPas   // The Grandfather's class
{
    public     $name1 = 'Mark Henry';  // This grandpa is mapped to a public modifier
    protected  $name2 = 'John Clash';  // This grandpa is mapped to a protected modifier
    private    $name3 = 'Will Jones';  // This grandpa is mapped to a private modifier
}

$granpaWithoutReflections = new GrandPas;
print_r($granpaWithoutReflections);

आउटपुट:

GrandPas Object
(
    [name1] => Mark Henry
    [name2:protected] => John Clash
    [name3:GrandPas:private] => Will Jones
)

डिबगिंग कार्य

print_r, var_exportऔर var_dumpकर रहे हैं डिबगर कार्यों । वे मानव-पठनीय रूप में एक चर के बारे में जानकारी प्रस्तुत करते हैं। ये तीन कार्य PHP 5 के साथ वस्तुओं के गुणों protectedऔर privateगुणों को प्रकट करेंगे । स्टेटिक क्लास के सदस्यों को नहीं दिखाया जाएगा।


और अधिक संसाधनों:



इस कॉनवो में देर से माफी के लिए माफी माँगता हूँ। क्या आप मुझे बता सकते हैं कि कोई इनका उपयोग क्यों करेगा? आपने पूरी तरह से समझाया कि वे कैसे काम करते हैं आदि .. मैं इनमें से प्रत्येक के लिए उपयोग के लाभों को जानना चाहूंगा। धन्यवाद
जेम्स

@ JamesG ने ऊपर की अन्य टिप्पणी में इसकी व्याख्या की है। stackoverflow.com/questions/4361553/...
cjmling

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

1
मेरा सुझाव है कि आप यहाँ धीरा लखेरा द्वारा प्रदान की गई अमूर्तता के बारे में स्पष्टीकरण पढ़ें: stackoverflow.com/questions/2558559/… । यह शंकर दामोदरन स्पष्टीकरण के लिए एक सही अतिरिक्त है।
जूलियो मरची

83

यह आमतौर पर सबसे कम दृश्यता के लिए आवश्यक अच्छा अभ्यास माना जाता है क्योंकि यह डेटा एनकैप्सुलेशन और अच्छे इंटरफ़ेस डिज़ाइन को बढ़ावा देता है। जब सदस्य चर और विधि दृश्यता पर विचार करते हैं तो सदस्य अन्य वस्तुओं के साथ बातचीत में भूमिका निभाता है।

यदि आप "कार्यान्वयन के बजाय एक इंटरफ़ेस पर कोड करते हैं" तो यह दृश्यता निर्णय लेने के लिए आमतौर पर बहुत सीधा है। सामान्य तौर पर, चर निजी या संरक्षित होने चाहिए, जब तक कि आपके पास उन्हें उजागर करने का एक अच्छा कारण न हो। किसी वर्ग के इंटर्नल तक पहुंच को सीमित करने और विनियमित करने के बजाय सार्वजनिक एक्सेसर्स (गेटर्स / सेटर) का उपयोग करें।

एक सादृश्य के रूप में एक कार का उपयोग करने के लिए, गति, गियर और दिशा जैसी चीजें निजी उदाहरण चर होंगी। आप नहीं चाहते कि ड्राइवर सीधे हवा / ईंधन अनुपात जैसी चीजों में हेरफेर करे। इसके बजाय, आप सीमित विधियों को सार्वजनिक विधियों के रूप में उजागर करते हैं। एक कार के लिए इंटरफ़ेस तरीकों जैसे शामिल हो सकता है accelerate(), deccelerate()/ brake(), setGear(), turnLeft(), turnRight(), आदि

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

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

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


3
इस पोस्ट के संपादन में अनुशंसित पुस्तक वास्तव में बहुत उत्कृष्ट है। मैंने अब तक के चंक को काफी ज्ञानवर्धक साबित किया है। पहले कुछ अध्यायों ने मेरे कक्षा से संबंधित अधिकांश सवालों के जवाब दिए।
योशिय्याह

उन किताबों ने मुझे वस्तुओं को वास्तव में समझने की अनुमति दी, बिना अनावश्यक विवरण के साथ मेरी सोच को भीड़ के बिना, उदाहरण के लिए स्मॉलटाकल में, डेविड ए टेलर द्वारा, ऑब्जेक्ट ओरिएंटेड टेक्नोलॉजी: ए मैनेजर गाइड और बिजनेस इंजीनियरिंग विद ऑब्जेक्ट टेक्नॉलॉजी थे । दोनों केवल 100 पृष्ठ हैं, और प्रत्येक दोपहर में पढ़ने के लिए पर्याप्त आसान है। बेशक, गामा एट अल के डिजाइन पैटर्न हैं , हालांकि मूल दृष्टिकोण को केवल 'उपवर्ग द्वारा वर्णित किया जा सकता है कि आप क्या अलग करना चाहते हैं'।
पतंजलि

एक बहुत अच्छा सादृश्य। क्या आपके पास संरक्षित निजी के लिए एक है?
जैनीस एल्मेरिस

79

private - केवल कक्षा से ही प्रवेश किया जा सकता है

protected - कक्षा और प्रवेश कक्षाओं में से पहुँचा जा सकता है

public - कोड के साथ ही कक्षा से बाहर तक पहुँचा जा सकता है

यह फ़ंक्शन के साथ-साथ चर पर भी लागू होता है।


सुनिश्चित नहीं है कि संरक्षित परिभाषा यहाँ सही है, वास्तविक चयनित उत्तर से ऐसा लगता है, संरक्षित - केवल विरासत में मिली कक्षा से पहुँचा जा सकता है और मूल / मूल वर्ग से नहीं। "क्लास के साथ" कहना थोड़ा भ्रामक हो सकता है।
pal4life

7
मुझे ऐसा नहीं लगता, वास्तव में ऐसा लगता है कि चयनित उत्तर वह है जो यहां भ्रमित कर रहा है। देखें शाहिद की टिप्पणी IMHO एक संरक्षित विधि बहुत अच्छी तरह से मूल वर्ग के भीतर से पहुँचा जा सकता है।
ओलाफ

क्या एक वर्ग दूसरे वर्ग की जनता तक पहुँच सकता है?
सर्जस

1
@ सरजस: नहीं, केवल एक अन्य वस्तु है, जब तक वे स्थिर तरीके / क्षेत्र नहीं हैं।
DanMan

मुझे नहीं पता कि यह सभी प्रोग्रामिंग भाषाओं पर लागू होता है, लेकिन PHP में "संरक्षित" गुणों / विधियों को उस वर्ग में पहुँचा जा सकता है, जिसमें यह घोषित किया गया है या वर्ग जो संपत्ति / विधि को परिभाषित करने वाले वर्ग से प्राप्त करते हैं।
जॉन सेलर्स

25

अंतर इस प्रकार है:

Public :: एक सार्वजनिक चर या विधि सीधे वर्ग के किसी भी उपयोगकर्ता द्वारा पहुँचा जा सकता है।

Protected :: एक संरक्षित चर या विधि को कक्षा के उपयोगकर्ताओं द्वारा एक्सेस नहीं किया जा सकता है, लेकिन एक उपवर्ग के अंदर पहुँचा जा सकता है जो वर्ग से विरासत में मिलता है।

Private :: एक निजी चर या विधि को केवल उस कक्षा से आंतरिक रूप से एक्सेस किया जा सकता है जिसमें इसे परिभाषित किया गया है। इसका मतलब है कि एक निजी चर या विधि को उस बच्चे से नहीं बुलाया जा सकता है जो कक्षा का विस्तार करता है।


17

अमूर्त उदाहरण के साथ दृश्यता स्कोप्स :: आसान समझ में आता है

संपत्ति या विधि की यह दृश्यता तीन कीवर्ड (सार्वजनिक, संरक्षित और निजी) में से एक के पूर्व-फिक्सिंग घोषणा से परिभाषित होती है

सार्वजनिक : यदि किसी संपत्ति या विधि को सार्वजनिक के रूप में परिभाषित किया जाता है, तो इसका मतलब है कि यह किसी भी चीज से पहुंच और हेरफेर दोनों हो सकता है जो ऑब्जेक्ट को संदर्भित कर सकता है।

  • सार उदाहरण। सार्वजनिक दृश्यता के दायरे को "सार्वजनिक पिकनिक" के रूप में सोचें जो कोई भी आ सकता है।

संरक्षित: जब कोई संपत्ति या विधि दृश्यता संरक्षित सदस्यों के लिए निर्धारित की जाती है, तो केवल कक्षा के भीतर और विरासत में मिली और विरासत वाली कक्षाओं तक ही पहुंच बनाई जा सकती है। (निहित: - एक वर्ग में किसी अन्य वर्ग के सभी गुण और तरीके हो सकते हैं)।

  • "कंपनी पिकनिक" के रूप में एक संरक्षित दृश्यता क्षेत्र के रूप में सोचें जहां कंपनी के सदस्यों और उनके परिवार के सदस्यों को जनता की अनुमति नहीं है। यह सबसे आम गुंजाइश प्रतिबंध है।

निजी: जब कोई संपत्ति या विधि दृश्यता निजी के लिए सेट की जाती है, तो केवल वह वर्ग जिसके पास निजी सदस्य होते हैं, उन तरीकों और गुणों (आंतरिक रूप से वर्ग के भीतर) तक पहुंच सकते हैं, जो कुछ भी वर्ग संबंध होने के बावजूद हो सकता है।

  • पिकनिक सादृश्य के साथ "कंपनी पिकनिक जहां पिकनिक में केवल कंपनी के सदस्यों को अनुमति दी जाती है" के रूप में सोचते हैं । परिवार को न तो आम जनता की अनुमति है।

15
/**
 * Define MyClass
 */
class MyClass
{
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj = new MyClass();
echo $obj->public; // Works
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Shows Public, Protected and Private


/**
 * Define MyClass2
 */
class MyClass2 extends MyClass
{
    // We can redeclare the public and protected method, but not private
    protected $protected = 'Protected2';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj2 = new MyClass2();
echo $obj2->public; // Works
echo $obj2->private; // Undefined
echo $obj2->protected; // Fatal Error
$obj2->printHello(); // Shows Public, Protected2, Undefined

इससे निष्कर्षित :

http://php.net/manual/en/language.oop5.visibility.php


12

⚡️ यहाँ के दायरे को याद रखने का एक आसान तरीका है public, protectedऔर private

PUBLIC:

  • public गुंजाइश: एक सार्वजनिक चर / फ़ंक्शन ऑब्जेक्ट और अन्य वर्गों दोनों के लिए उपलब्ध है।

PROTECTED:

  • protected गुंजाइश: एक संरक्षित चर / फ़ंक्शन सभी वर्गों के लिए उपलब्ध है जो वर्तमान वर्ग का विस्तार करते हैं।
  • नहीं! ऑब्जेक्ट इस दायरे तक नहीं पहुंच सकते

PRIVATE:

  • private गुंजाइश: एक निजी चर / फ़ंक्शन केवल वर्तमान वर्ग में दिखाई देता है जहां इसे परिभाषित किया जा रहा है।
  • नहीं! वर्तमान वर्ग का विस्तार करने वाला वर्ग इस दायरे तक नहीं पहुँच सकता है।
  • नहीं! ऑब्जेक्ट इस दायरे तक नहीं पहुंच सकते।

PHP मैन्युअल पर एक विधि या चर की दृश्यता पढ़ें ।


9

' कब ':
मैं सब कुछ निजी रूप से शुरू में घोषित करता हूं, अगर मुझे बिल्कुल यकीन नहीं है। कारण बताया जा रहा है, कि आमतौर पर निजी तरीके को दूसरे तरीके से सार्वजनिक करना ज्यादा आसान होता है। ऐसा इसलिए है क्योंकि आप कम से कम यह सुनिश्चित कर सकते हैं कि निजी पद्धति का उपयोग कहीं और नहीं बल्कि कक्षा में ही किया जाए। एक सार्वजनिक विधि पहले से ही हर जगह उपयोग में हो सकती है, संभवतः एक व्यापक पुन: लिखने की आवश्यकता होती है।

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

एक privateविधि के लिए एक अच्छा कारण वह होगा जो उस वस्तु में निहित किसी चीज को लागू करता है, यहां तक ​​कि एक विस्तारित वर्ग को भी नहीं बदलना चाहिए (तथ्यात्मक कारण, इनकैप्सुलेशन के अलावा, आंतरिक राज्य प्रबंधन की तरह)। आखिरकार, यह अभी भी नीचे ट्रैक करना काफी आसान है जहां एक protectedविधि का आमतौर पर उपयोग किया जा रहा है, इसलिए मैं protectedआजकल डिफ़ॉल्ट रूप से उपयोग करता हूं । शायद 100% उद्देश्य "खाइयों में" अनुभव नहीं है, मैं मानता हूं।


3
अपने अपडेट के साथ: क्या आप अधिक स्पष्ट कर सकते हैं कि "अच्छा पर्याप्त" और "अच्छा कारण" यहां एक साथ कैसे चलते हैं? उदाहरण के लिए, उपयोग privateकरना अभी भी "अच्छा पर्याप्त" होगा, लेकिन आप यह नहीं सुझाव देते हैं कि किसी भी लंबे समय के कारण जो आपने पहले "अच्छे कारण" की तरह ध्वनि दिया था: अभी भी।
हक्रे

@ खाक्रे: हम एनकैप्सुलेशन के लिए प्रयास करना चाहते हैं, यही कारण है कि बाहरी दायरे में लीक होने से बचना चाहिए। protectedपहले से ही है, लेकिन आप इसे विस्तार / विरासत के लिए लचीला रखते हैं। फिर, जब तक आपके पास इसे बनाने का एक अच्छा कारण नहीं है private
डैनमैन

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

मैं आपके समग्र बिंदु के साथ बहस नहीं करूंगा, क्योंकि यह काफी हद तक सही है, लेकिन बाहरी दायरे protectedमें नहीं आता है (कोड जो विधि / क्षेत्र को कॉल / एक्सेस कर रहा है) लेकिन केवल आंतरिक गुंजाइश (फैली हुई कक्षाएं)। वहाँ एक अंतर है, के रूप में यह आप के लिए हो सकता है के रूप में मामूली। किसी एक क्षेत्र के उपयोग को ट्रैक करना बहुत आसान है । protectedpublic
डैनमैन

6

PHP मैनुअल यहाँ प्रश्न पर एक अच्छा पढ़ा है

किसी संपत्ति या विधि की दृश्यता को सार्वजनिक, संरक्षित या निजी कीवर्ड के साथ घोषणा को उपसर्ग द्वारा परिभाषित किया जा सकता है। सार्वजनिक घोषित वर्ग के सदस्यों को हर जगह पहुँचा जा सकता है। संरक्षित घोषित किए गए सदस्यों को केवल कक्षा के भीतर और विरासत में मिले अभिभावकों द्वारा ही पहुँचा जा सकता है। निजी घोषित किए गए सदस्य केवल उसी वर्ग तक पहुंच सकते हैं जो सदस्य को परिभाषित करता है।


6

मेरे लिए, यह तीन संपत्ति प्रकारों को समझने का सबसे उपयोगी तरीका है:

सार्वजनिक : इसका उपयोग तब करें जब आप इस चर को ठीक से एक्सेस कर रहे हों और आपके कोड में कहीं से भी बदला गया हो।

कक्षा के बाहर से उदाहरण का उपयोग:

$myObject = new MyObject()
$myObject->publicVar = 'newvalue';
$pubVar = $myObject->publicVar;

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

क्यों? क्योंकि यदि आप भविष्य में कुछ बिंदु पर फैसला करते हैं (शायद 5 मिनट में भी) कि आप उस संपत्ति के लिए लौटाए गए मूल्य में हेरफेर करना चाहते हैं या मिलने / स्थापित होने से पहले उसके साथ कुछ कर सकते हैं, तो आप ऐसा कर सकते हैं कि आपके पास हर जगह बिना रिफलेक्टर किए अपने प्रोजेक्ट में इसका इस्तेमाल किया।

कक्षा के बाहर से उदाहरण का उपयोग:

$myObject = new MyObject()
$myObject->setProtectedVar('newvalue');
$protectedVar = $myObject->getProtectedVar();

निजी : privateगुण गुणों के समान protectedहैं। लेकिन विशिष्ट विशेषता / अंतर यह है कि यह बना रहा हैprivate भी अभिभावक वर्ग के गेटटर या सेटर का उपयोग किए बिना इसे बाल कक्षाओं के लिए दुर्गम बनाता है।

इसलिए मूल रूप से, यदि आप एक संपत्ति के लिए गेटर्स और सेटर का उपयोग कर रहे हैं (या यदि इसका उपयोग केवल मूल वर्ग द्वारा आंतरिक रूप से किया जाता है और इसका मतलब कहीं और पहुंच योग्य नहीं है) तो आप इसे बना सकते हैं private, बस किसी को भी प्रयास करने से रोक सकते हैं इसका उपयोग करने के लिए सीधे और बग का परिचय

बाल वर्ग के अंदर उदाहरण का उपयोग (जो MyObject का विस्तार करता है):

$this->setPrivateVar('newvalue');
$privateVar = $this->getPrivateVar();


4

PHP में चर तीन अलग-अलग प्रकारों में डाले जाते हैं:

सार्वजनिक: इस चर प्रकार के मूल्य सभी दायरे में उपलब्ध हैं और आपको कोड के निष्पादन पर बुलाते हैं। इस रूप में घोषित करें:public $examTimeTable;

निजी: इस प्रकार के वैरिएबल के मूल्य केवल उस वर्ग के लिए उपलब्ध हैं, जो इसके अंतर्गत आता है। private $classRoomComputers;

संरक्षित: इस वर्ग के मूल्य केवल और केवल तब उपलब्ध होते हैं जब प्रवेश विरासत या उनके बाल वर्ग के रूप में प्रदान किया जाता है। आमतौर पर ::अभिभावक वर्ग द्वारा पहुँच प्रदान करने के लिए उपयोग किया जाता है

protected $familyWealth;


3

एक पुराने प्रश्न को पुनर्जीवित करना, लेकिन मुझे लगता है कि यह सोचने का एक अच्छा तरीका एपीआई के संदर्भ में है जिसे आप परिभाषित कर रहे हैं।

  • public - सब कुछ चिह्नित सार्वजनिक एपीआई का हिस्सा है जो आपके वर्ग / इंटरफ़ेस / अन्य का उपयोग करने वाला कोई भी व्यक्ति उपयोग करेगा और उस पर भरोसा करेगा।

  • protected- मूर्ख मत बनो, यह भी एपीआई का हिस्सा है! लोग उप-कोड कर सकते हैं, अपना कोड बढ़ा सकते हैं और संरक्षित चिन्हित किसी भी चीज़ का उपयोग कर सकते हैं।

  • private- निजी गुण और विधियों को जितना चाहें बदल दिया जा सकता है। कोई और इनका उपयोग नहीं कर सकता है। ये एकमात्र ऐसी चीजें हैं जिन्हें आप बिना बदलाव किए बदल सकते हैं।

या सेमर शब्दों में:

  • किसी भी चीज में परिवर्तन publicया protectedMAJOR परिवर्तन माना जाना चाहिए।

  • कुछ भी नया publicया protectedकम से कम (कम से कम) होना चाहिए

  • कुछ भी नया / परिवर्तन केवल privatePATCH हो सकता है

तो कोड बनाए रखने के मामले में, यह अच्छा है कि आप किन चीजों के बारे में सावधान रहें publicया protectedक्योंकि ये ऐसी चीजें हैं जो आप अपने उपयोगकर्ताओं के लिए वादा कर रहे हैं।


1

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

  1. जनता
  2. निजी
  3. संरक्षित

अब, एक्सेस मॉडिफायर एक्सेस लेवल को समझने के लिए निम्न इमेज पर एक नजर डालते हैं यहां छवि विवरण दर्ज करें

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

सार्वजनिक: - वर्ग या उसके सदस्य इस एक्सेस संशोधक के साथ परिभाषित होते हैं, सार्वजनिक रूप से कक्षा के बाहर से भी, कहीं से भी सुलभ होंगे।

निजी: - इस कीवर्ड के साथ वर्ग के सदस्यों को कक्षा के भीतर ही एक्सेस किया जाएगा। हम उपवर्ग से निजी डेटा तक नहीं पहुँच सकते। यह सदस्यों को बाहरी वर्ग की पहुंच से बचाता है।

संरक्षित: - निजी के समान, केवल उपवर्गों को संरक्षित सुपरक्लास सदस्यों तक पहुँचने की अनुमति देकर।

अब एक्सेस संशोधक को समझने के लिए तालिका देखें। पूर्ण लेख पढ़ें php एक्सेस मोडिफायर


1

Public: एक डिफ़ॉल्ट स्थिति है जब आप एक चर या विधि की घोषणा करते हैं, तो किसी भी चीज से सीधे वस्तु तक पहुँचा जा सकता है।

Protected: केवल वस्तु और उपवर्गों के भीतर पहुँचा जा सकता है।

Private: केवल वस्तु के भीतर संदर्भित किया जा सकता है, उपवर्ग नहीं।


0

उल्लिखित कीवर्ड एक्सेस मॉडिफायर हैं और हमें एनकैप्सुलेशन (या सूचना छिपाने) को लागू करने में मदद करते हैं। वे संकलक को बताते हैं कि अन्य वर्गों को किस क्षेत्र या विधि के लिए परिभाषित किया जाना चाहिए।

निजी - केवल वर्तमान वर्ग के पास क्षेत्र या विधि तक पहुंच होगी।

संरक्षित - इस वर्ग के केवल वर्तमान वर्ग और उपवर्ग (और कभी-कभी समान-पैकेज वर्ग) के लिए क्षेत्र या विधि तक पहुंच होगी।

सार्वजनिक - कोई भी वर्ग क्षेत्र को संदर्भित कर सकता है या विधि को कॉल कर सकता है।

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