2010-08-13 19 views
10

के बाहर एक संरक्षित सदस्य चर का उपयोग करना मैं किसी वर्ग फ़ंक्शन तक पहुंचकर किसी फ़ील्ड की आईडी के लिए पूछताछ कर रहा हूं जिसे किसी ने पहले से ही रखा है। परिणाम संरक्षित सदस्य चर के साथ लौटा एक वस्तु है। मैं यह देखने के लिए संघर्ष कर रहा हूं कि मैं कक्षा के बाहर सदस्य परिवर्तनीय मूल्यों का उपयोग कैसे कर सकता हूं।कक्षा

+0

आप किस भाषा का प्रयोग कर रहे ?? –

+0

मैं php का उपयोग कर रहा हूं .... –

उत्तर

11

बस कक्षा में "प्राप्त करें" विधि जोड़ें।

class Foo 
{ 
    protected $bar = 'Hello World!'; 

    public function getBar() 
    { 
     return $this->bar; 
    } 
} 

$baz = new Foo(); 

echo $baz->getBar(); 
+0

स्पष्ट रूप से हमारे पास पहले से ही एक जगह थी जिसने मुझे सरल उपयोग -> getId() और विभिन्न वर्गों से पुनर्प्राप्त करने की अनुमति दी। –

3

मैं यह देखने के लिए संघर्ष कर रहा हूं कि मैं कक्षा के बाहर सदस्य चर मूल्यों को कैसे एक्सेस कर सकता हूं।

आप नहीं कर सकते: यह protected का पूरा बिंदु है।

आपको कक्षा के लिए वेरिएबल्स लाने वाली विधि के साथ extend कक्षा होगी।

आप इसे तत्काल वस्तु पर नहीं कर सकते हैं, हालांकि - आपको कक्षा परिभाषा को प्रभावित करना होगा, या उस बिंदु पर ऑब्जेक्ट की कक्षा को बदलना होगा।

0

तुम सच है कि मूल्य की जरूरत है:

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

स्पष्ट रूप से, क्लास डिजाइनर को नहीं लगता था कि आपको उस मूल्य की आवश्यकता होगी जिसे आप एक्सेस करने का प्रयास कर रहे हैं, अन्यथा वह इसे स्वयं प्राप्त करने के लिए एक विधि जोड़ता। इसलिए, आप जो कर रहे हैं पर पुनर्विचार करें।

-2

अस्वीकरण: मुझे याद नहीं है कि कोड कैसे करें। इसे बीते एक अर्सा हो गया है"। यह पूरी तरह से बंद हो सकता है।

ठीक है, सबसे पहले, यदि सदस्यों की सुरक्षा की जाती है, तो मूल डिजाइनर आपके लिए सीधे उन तक पहुंचने का इरादा नहीं रखता था। क्या आपने एक्सेसर विधियों की जांच की?

यदि कोई नहीं है, और आपको विश्वास दिलाया गया है कि आपको वास्तव में इन संरक्षित सदस्यों की आवश्यकता है, तो आप एक्सेसर्स के साथ प्रकार का विस्तार कर सकते हैं, कास्ट कर सकते हैं और उन्हें इस तरह से प्राप्त कर सकते हैं। की तरह (C++ - जैसे कोड)

class MyClass : public OldClass 
{ 
public: 
int getSomeValue() { return protectedValue; } 
void setSomeValue(int value) { protectedValue=value; } 
char* getOtherValue() { return otherProtectedValue; } 
} 

और फिर इसे

MyClass* blah = (MyClass*)TheirFactory->GiveMeAClass(); 
int yay=blah->getSomeValue(); 

उपयोग करने के लिए आप बहाव मिलता है। उम्मीद है कि यह आपके लिए काम करता है, इंटरनेट एक्सप्लोरर एक लुसी कंपाइलर बनाता है, इसलिए मैं इसका परीक्षण करने में सक्षम नहीं हूं। }

+1

यह बहुत अच्छा है, लेकिन ओपी को एक PHP समाधान की आवश्यकता है :) –

+1

अच्छा, मुझे लगता है कि PHP विरासत और कास्टिंग का समर्थन करता है, और मुझे उम्मीद है कि वह समझ पाएगा सी ++ कोड PHP में इसे लागू करने के लिए पर्याप्त है :) – Tobias

15

सार्वजनिक से सुरक्षित या निजी चर का उपयोग करना गलत है (यही कारण है कि वे सुरक्षित या निजी हैं)। कक्षा का विस्तार करना और आवश्यक संपत्ति तक पहुंच बनाना या इसे प्रकाशन प्राप्त करने के लिए गेटर विधि बनाना बेहतर है। लेकिन यदि आप अभी भी विस्तार किए बिना गुण प्राप्त करना चाहते हैं और यदि आप PHP 5 का उपयोग कर रहे हैं, तो आप कक्षाओं के साथ acces कर सकते हैं। वास्तव में ReflectionProperty कक्षा का प्रयास करें।

class Foo { protected $bar; } 
$foo = new Foo(); 

$rp = new ReflectionProperty('Foo', 'bar'); 
$rp->setAccessible(true); 
echo $rp->getValue($foo); 
+1

+1 'प्रतिबिंबप्रोपर्टी' ने मेरे लिए काम किया। लेकिन 'ReflectionProperty :: setAccessible (true)' को कॉल करना न भूलें। – Asaph

+0

यह सही उत्तर है। ध्यान दें कि ReflectionProperty का पहला पैरामीटर पूरी तरह से नामांकित कक्षा होना चाहिए। –

2

आप, बाहर वर्ग की ओर वर्ग की रक्षा की सदस्य तक पहुँच सकते हैं भी विस्तार संरक्षित सदस्य वर्ग के बिना भी संरक्षित सदस्य वर्ग के किसी भी समारोह का उपयोग किए बिना। इसे एक्सेस करने के लिए नीचे दिए गए फ़ंक्शन का उपयोग करें।

function getProtectedMember($class_object,$protected_member) { 
    $array = (array)$class_object;  //Object typecast into (associative) array 
    $prefix = chr(0).’*’.chr(0);   //Prefix which is prefixed to protected member 
    return $array[$prefix.$protected_member]; 
} 

कृपया इसके बारे में अधिक जानकारी देखने के लिए Link पर जाएं।

6

यहाँ सही जवाब है:

हम उदाहरण के लिए कुछ वर्ग के निजी/सुरक्षित डेटा तक पहुँचने के लिए, बाँध() या बंद वर्ग के bindTo तरीकों का उपयोग कर सकते हैं:

class MyClass { 
      protected $variable = 'I am protected variable!'; 
} 

$closure = function() { 
      return $this->variable; 
}; 

$result = Closure::bind($closure, new MyClass(), 'MyClass'); 
echo $result(); // I am protected variable! 
+2

वाह! वह सुंदर है। इसके पास और वोट क्यों नहीं हैं ?? – CenterOrbit