2011-06-23 9 views
50

मैं कक्षाओं के स्थिर गुणों के लिए बैकअप/पुनर्स्थापना कार्य करने की कोशिश कर रहा हूं। मैं प्रतिबिंब वस्तुओं getStaticProperties() विधि का उपयोग कर सभी स्थिर गुणों और उनके मूल्यों की एक सूची प्राप्त कर सकता हूं। यह private और public static गुण और उनके मूल्य दोनों प्राप्त करता है।क्या प्रतिबिंब कक्षाओं का उपयोग कर एक निजी/संरक्षित स्थिर संपत्ति सेट करने का कोई तरीका है?

समस्या यह है कि प्रतिबिंब वस्तुओं setStaticPropertyValue($key, $value) विधि के साथ गुणों को पुनर्स्थापित करने का प्रयास करते समय मुझे एक ही परिणाम नहीं मिल रहा है। private और protected चर इस विधि को दिखाई नहीं दे रहे हैं क्योंकि वे getStaticProperties() हैं। असंगत लगता है।

क्या प्रतिबिंब वर्गों का उपयोग करके निजी या संरक्षित स्थैतिक संपत्ति सेट करने का कोई तरीका है या उस मामले के लिए किसी अन्य तरीके से?

class Foo { 
    static public $test1 = 1; 
    static protected $test2 = 2; 

    public function test() { 
     echo self::$test1 . '<br>'; 
     echo self::$test2 . '<br><br>'; 
    } 

    public function change() { 
     self::$test1 = 3; 
     self::$test2 = 4; 
    } 
} 

$test = new foo(); 
$test->test(); 

// Backup 
$test2 = new ReflectionObject($test); 
$backup = $test2->getStaticProperties(); 

$test->change(); 

// Restore 
foreach ($backup as $key => $value) { 
    $property = $test2->getProperty($key); 
    $property->setAccessible(true); 
    $test2->setStaticPropertyValue($key, $value); 
} 

$test->test(); 

उत्तर

65

की कोशिश की एक वर्ग हम पहले उस वर्ग की पहुंच स्थापित करने के लिए, प्रतिबिंब का उपयोग की आवश्यकता हो सकती के निजी/संरक्षित गुण तक पहुँचने के लिए। निम्नलिखित कोड का प्रयास करें:

स्थिर गुणों के लिए::

<?php 
$reflection = new \ReflectionProperty('ClassName', 'propertyName'); 
$reflection->setAccessible(true); 
$reflection->setValue(null, 'new property value'); 


$obj   = new ClassName(); 
$refObject = new ReflectionObject($obj); 
$refProperty = $refObject->getProperty('property'); 
$refProperty->setAccessible(true); 
$refProperty->setValue(null, 'new value'); 
+1

यह बहुत अधिक सही है, आप संभवतः '$ refProperty-> setValue (शून्य, 'नया मान') का उपयोग करना चाहते हैं; 'चर के नए मान को सेट करने के लिए। – tplaner

+0

धन्यवाद @evolve। जब तक मैं setValue() का उपयोग नहीं करता तब तक काम नहीं कर रहा था। धन्यवाद! – dqhendricks

+0

@dhehendricks कोई समस्या नहीं, अच्छा सवाल है। – tplaner

33

एक ReflectionObject उदाहरण के लिए, एक वर्ग के निजी/संरक्षित गुण तक पहुँचने प्रतिबिंब का उपयोग की आवश्यकता के बिना, के लिए गैर स्थैतिक गुणों के लिए:

<?php 
$instance = New SomeClassName(); 
$reflection = new \ReflectionProperty(get_class($instance), 'propertyName'); 
$reflection->setAccessible(true); 
$reflection->setValue($instance, 'new property value'); 
+0

' रिफ्लेक्शनप्रोपर्टी :: सेटवैल्यू() पैरामीटर 1 ऑब्जेक्ट होने की अपेक्षा करता है, शून्य दिया गया है 'आपके उत्तर में एक ही समस्या है जैसा कि मैंने @ शमी के – ThorSummoner

+1

के साथ किया था यह निश्चित रूप से PHP 5.6 में काम करता है, और दस्तावेज़ीकरण से पता चलता है कि यह था हमेशा यह कैसे काम करना चाहिए (देखें: http://php.net/manual/en/reflectionproperty.setvalue.php), इसलिए सुनिश्चित नहीं है कि यह @ThorSummoner के लिए क्यों काम नहीं करता – DanielM

संबंधित मुद्दे

 संबंधित मुद्दे