2011-06-17 25 views
5

में गुमनाम समारोह में एक वस्तु का निजी/संरक्षित गुण को एक्सेस करना मैं एक गुमनाम समारोह के माध्यम से एक वस्तु की निजी संपत्ति के तत्वों डंप करने की कोशिश कर रहा हूँ - मैं अन्य किसी भी तरीके से में इस लक्ष्य को हासिल कर सकता है, ज़ाहिर है, लेकिन यह एक पर प्रकाश डाला गया पीएचपी पहेली मैं अपने सिर के ऊपर से हल नहीं कर सकते हैं, $ से कम foo = $ इस और $ foo का उपयोग कर - लेकिन यह है कि मुझे निजी सामान नहीं देंगे, इसलिए ... सुझाव?पीएचपी

नमूना कोड:

class MyClass 
{ 
    private $payload = Array('a' => 'A element', 'b' => 'B element'); 

    static $csvOrder = Array('b','a'); 

    public function toCSV(){ 
     $values = array_map(
      function($name) use ($this) { return $this->payload[$name]; }, 
      self::$csvOrder 
     ); 
     return implode(',',$values); 
    } 
} 

$mc = new MyClass(); 
print $mc->toCSV(); 
+1

की Dup (http://stackoverflow.com/q/3722394/90527) [ "को बंद करने के भीतर से निजी चर तक पहुँचना"], लेकिन NikiC के जवाब गैर सरकारी तरीकों के साथ-साथ गैर सरकारी संपत्तियों तक पहुँचने के लिए काम करता है, तो बंद करने के लिए मतदान नहीं। – outis

उत्तर

3

मेरा मानना ​​है कि वहाँ बिल्कुल सीधे करने के लिए आप क्या प्रस्ताव है कोई रास्ता नहीं है।

हालांकि, आप गुमनाम विधि को एक क्लास विधि बनाकर इसके आसपास काम कर सकते हैं (यह वह नहीं है जिसे आपने पूछा है, लेकिन यह एक व्यावहारिक समाधान हो सकता है) या $this से निकाली गई सब कुछ खींचकर स्पष्ट रूप से निकाला जा रहा है फ़ंक्शन में मान:

class MyClass 
{ 
    private $payload = Array('a' => 'A element', 'b' => 'B element'); 

    static $csvOrder = Array('b','a'); 

    public function toCSV(){ 
     $payload = $this->payload; 
     $values = array_map(
      function($name) use ($payload) { return $payload[$name]; }, 
      self::$csvOrder 
     ); 
     return implode(',',$values); 
    } 
} 
+0

दरअसल - आपका कोड दर्शाता है कि मैं इस विशेष मामले में क्या कर रहा हूं। ओह ठीक है, यह सामान्य रूप से एक दिलचस्प समस्या है - उम्मीद कर रहा था कि इस मुद्दे को हल करने का कोई तरीका था जिसे मैं अनजान था। उत्तर के लिए धन्यवाद :) – Wagemage

+0

+1 इससे पहले कि मैंने महसूस किया कि आपने पहले ही यह कहा है, मैंने इसके साथ एक उत्तर पोस्ट किया है। सबसे सरल समाधान अक्सर सबसे अच्छा होता है। –

1

जैसा कि आपने स्वयं कहा था, यह निजी है और इसलिए सुलभ है।

आप कर सकते हैं:

  • $ this-> पेलोड गुमनाम कार्य करने के लिए एक पैरामीटर के रूप दर्रा।
  • कक्षा में एक विधि बनाएं और बदले में उपयोग करें।
3

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

$self = new FullAccessWrapper($this); 
function() use ($self) { /* ... */ } 

यहाँ आवरण का एक नमूना कार्यान्वयन, here से लिया:

class FullAccessWrapper 
{ 
    protected $_self; 
    protected $_refl; 

    public function __construct($self) 
    { 
     $this->_self = $self; 
     $this->_refl = new ReflectionObject($self); 
    } 

    public function __call($method, $args) 
    { 
     $mrefl = $this->_refl->getMethod($method); 
     $mrefl->setAccessible(true); 
     return $mrefl->invokeArgs($this->_self, $args); 
    } 

    public function __set($name, $value) 
    { 
     $prefl = $this->_refl->getProperty($name); 
     $prefl->setAccessible(true); 
     $prefl->setValue($this->_self, $value); 
    } 

    public function __get($name) 
    { 
     $prefl = $this->_refl->getProperty($name); 
     $prefl->setAccessible(true); 
     return $prefl->getValue($this->_self); 
    } 

    public function __isset($name) 
    { 
     $value = $this->__get($name); 
     return isset($value); 
    } 
} 

जाहिर है इसके बाद के संस्करण कार्यान्वयन सभी पहलुओं (कवर नहीं करता है जैसे यह नहीं कर सकते जादू गुणों और विधियों का उपयोग करें)।

+0

बेशक दिलचस्प बात यह है बुराई :) शायद नहीं है कि मैं क्या उत्पादन के लिए करना चाहते हैं, लेकिन यह * * समस्या को हल करता है - धन्यवाद – Wagemage