"प्रतिबिंब" का उपयोग किए बिना किसी वस्तु के सभी गुणों का उपयोग कैसे करें

किसी ऑब्जेक्ट की सभी संपत्तियों तक पहुंच क्यों और फिर भी इसका इंटरफ़ेस नहीं बदला जाए? उदाहरण के लिए, क्रमबद्धता लिखने के लिए। या http का उपयोग करके ऑब्जेक्ट को स्वीकार्य रूप में पास करना। या किसी और चीज के लिए।

आइए प्रयोग के लिए एक सरल वर्ग लें।

class aClass { protected $protected_property = 'protected_value'; private $private_property = 'private_value'; public $public_property = 'public_value'; } $an_object = new aClass; var_dump($an_object); // object(aClass)#1 (3) { // ["protected_property":protected]=> // string(15) "protected_value" // ["private_property":"aClass":private]=> // string(13) "private_value" // ["public_property"]=> // string(12) "public_value" // } 


यदि आप "प्रतिबिंब" का उपयोग करते हैं, तो आप किसी वस्तु के सभी गुण प्राप्त कर सकते हैं, उदाहरण के लिए, इस तरह से।

 $an_array = array(); $reflection = new ReflectionClass($an_object); $properties = $reflection->getProperties(); foreach ($properties as $property) { $property->setAccessible(true); $an_array[$property->getName()] = $property->getValue($an_object); if (!$property->isPublic()) $property->setAccessible(false); } var_dump($an_array); // array(3) { // ["protected_property"]=> // string(15) "protected_value" // ["private_property"]=> // string(13) "private_value" // ["public_property"]=> // string(12) "public_value" // } 


एक सरणी के रूप में सभी गुणों को प्राप्त करने का एक आसान तरीका है।

 $an_array = (array) $an_object; var_dump($an_array); // array(3) { // [" * protected_property"]=> // string(15) "protected_value" // [" aClass private_property"]=> // string(13) "private_value" // ["public_property"]=> // string(12) "public_value" // } 


यह थोड़ा "गंदा" निकला, यदि आवश्यक हो, तो आप अनावश्यक डेटा से चाबियाँ साफ कर सकते हैं। उदाहरण के लिए, इस तरह:

 $key = ($key{0} === "\0") ? substr($key, strpos($key, "\0", 1) + 1) : $key; 


वैसे, सरणी को किसी ऑब्जेक्ट में परिवर्तित करने के साथ रिवर्स ट्रिक काम नहीं करेगी। इस तरह आप केवल stdClass ऑब्जेक्ट प्राप्त कर सकते हैं।

 $an_another_object = (object) $an_array; var_dump($an_another_object); // object(stdClass)#6 (3) { // ["protected_property":protected]=> // string(15) "protected_value" // ["private_property":"aClass":private]=> // string(13) "private_value" // ["public_property"]=> // string(12) "public_value" // } 


गुण प्राप्त करने के लिए अभी भी एक अनैच्छिक तरीका है। यह विधि बग की तरह भी दिखती है, लेकिन ऐसा नहीं है, इसलिए इसे सुरक्षित रूप से इस्तेमाल किया जा सकता है।

 $an_array = array(); reset($an_object); while (list($key, $val) = each($an_object)) $an_array[$key] = $val; var_dump($an_array); // array(3) { // [" * protected_property"]=> // string(15) "protected_value" // [" aClass private_property"]=> // string(13) "private_value" // ["public_property"]=> // string(12) "public_value" // } 


बदले में, एक अनियंत्रित संपत्ति (एक निजी सहित) के लिए एक नया मूल्य निर्धारित करने के लिए, एक पहले से ही किसी अन्य अनिर्दिष्ट चाल का उपयोग कर सकता है।

 $an_array["\0aClass\0private_property"] = 'new_private_value'; array_walk($an_object, function(&$val, $key, $array){$val = $array[$key];}, $an_array); var_dump($an_object); // object(aClass)#1 (3) { // ["protected_property":protected]=> // string(15) "protected_value" // ["private_property":"aClass":private]=> // string(17) "new_private_value" // ["public_property"]=> // string(12) "public_value" // } 


निष्कर्ष

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

Source: https://habr.com/ru/post/In138102/


All Articles