दिलचस्प पोस्ट
AddTarget के लिए मापदंडों को पास करना: कार्यवाही: नियंत्रण एंटर के लिए php curl: मैं एक वेब ब्राउज़र की तरह ठीक एक अनुरोध प्राप्त कैसे कर सकता हूँ? अक्षांश परिभाषा में टिल्ड (~) क्या है? कैसे int से char * कन्वर्ट करने के लिए? पायथन नियमित अभिव्यक्ति में बैकस्लैश स्ट्रिंग को "" का उपयोग करके कैसे प्रारंभ किया जा सकता है? कितने सॉकेट कनेक्शन संभव हैं? PHP वैरिएबल के रूप में जावा स्क्रिप्ट व्हेरिएबल का उपयोग कैसे कर सकता हूं? Document.getElementByName और getElementByTag का उपयोग कैसे करें? मूल फ़ोल्डर से मॉड्यूल आयात करना Int8_t, int_least8_t और int_fast8_t का अंतर? HTML + सीएसएस: अवधि के बिना आदेश की सूची? वर्कशीट वर्ग की सभीडेटा विधि विफल हुई PHP file_get_contents () रिटर्न "स्ट्रीम खोलने में विफल: HTTP अनुरोध विफल!" स्ट्रिंग के सेट की एक चर संख्या के चौराहे को कुशलतापूर्वक खोजना

स्ट्रिंग द्वारा PHP वर्ग की संपत्ति प्राप्त करें

स्ट्रिंग के आधार पर मैं PHP में एक संपत्ति कैसे प्राप्त करूं? मैं इसे magic कहूँगा तो magic क्या है?

 $obj->Name = 'something'; $get = $obj->Name; 

की तरह होगा…

 magic($obj, 'Name', 'something'); $get = magic($obj, 'Name'); 

Solutions Collecting From Web of "स्ट्रिंग द्वारा PHP वर्ग की संपत्ति प्राप्त करें"

इस कदर

 <?php $prop = 'Name'; echo $obj->$prop; 

या, यदि आप कक्षा पर नियंत्रण रखते हैं, तो ArrayAccess इंटरफ़ेस को लागू करें और ऐसा करें

 echo $obj['Name']; 

यदि आप एक मध्यवर्ती चर बनाने के बिना संपत्ति का उपयोग करना चाहते हैं, तो {} नोटेशन का उपयोग करें:

 $something = $object->{'something'}; 

यह आपको उदाहरण के लिए एक पाश में प्रॉपर्टी नाम बनाने की सुविधा भी देता है:

 for ($i = 0; $i < 5; $i++) { $something = $object->{'something' . $i}; // ... } 

आप किस बारे में पूछ रहे हैं उसे व्हेरिएबल वैरिएबल कहा जाता है आपको केवल अपनी स्ट्रिंग को एक वेरिएबल में स्टोर करने की ज़रूरत है और इसे इस तरह से एक्सेस करें:

 $Class = 'MyCustomClass'; $Property = 'Name'; $List = array('Name'); $Object = new $Class(); // All of these will echo the same property echo $Object->$Property; // Evaluates to $Object->Name echo $Object->{$List[0]}; // Use if your variable is in an array 

कुछ इस तरह? इसका परीक्षण नहीं किया है लेकिन ठीक काम करना चाहिए।

 function magic($obj, $var, $value = NULL) { if($value == NULL) { return $obj->$var; } else { $obj->$var = $value; } } 

बस एक वैरिएबल में प्रॉपर्टी नाम को स्टोर करें, और संपत्ति का उपयोग करने के लिए वेरिएबल का उपयोग करें। इस कदर:

 $name = 'Name'; $obj->$name = 'something'; $get = $obj->$name; 

यह सरल है, $ obj -> {$ obj-> नाम}, घुंघराले ब्रैकेट एक चर वैरिएबल की तरह संपत्ति लपेटते हैं।

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

उदाहरण उदाहरण के साथ कोड इग्नेटर मिलता है

एक sourced पुस्तकालय कक्षा में एक अभिभावक वर्ग उदाहरण के साथ कुछ कहा जाता है

 $this->someClass='something'; $this->someID=34; 

लाइब्रेरी वर्ग को माता-पिता के उदाहरण के साथ दूसरे वर्ग से स्रोत की आवश्यकता होती है

 echo $this->CI->{$this->someClass}->{$this->someID}; 

बस एक अतिरिक्त के रूप में: इस तरह आप उन नामों के साथ गुणों का उपयोग कर सकते हैं जो अन्यथा अनुपयोगी होंगे

  $ x = नया स्टड क्लास; 

$ prop = 'a b';
$ x -> $ prop = 1;
$ x -> {'x y'} = 2;
var_dump ($ x);

  वस्तु (stdClass) # 1 (2) {
   [ "Ab"] =>
   पूर्णांक (1)
   [ "Xy"] =>
   पूर्णांक (2)
 } 

(ऐसा नहीं होना चाहिए, लेकिन यदि आपको करना है)।
यदि आप भी कमाल का सामान करना चाहते हैं तो आपको प्रतिबिंब में देखना चाहिए

इस प्रश्न का उत्तर हो सकता है, लेकिन आप इन माइग्रेशन को PHP 7 पर देख सकते हैं

पिछड़े असंगत परिवर्तन

स्रोत: php.net

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

आप उन 'property_exists' चेक को __सेट और __get के लिए क्रमशः ले जा सकते हैं और उन्हें मैजिक के भीतर सीधे कॉल कर सकते हैं ()।

 <?php class Foo { public $Name; public function magic($member, $value = NULL) { if ($value != NULL) { if (!property_exists($this, $member)) { trigger_error('Undefined property via magic(): ' . $member, E_USER_ERROR); return NULL; } $this->$member = $value; } else { if (!property_exists($this, $member)) { trigger_error('Undefined property via magic(): ' . $member, E_USER_ERROR); return NULL; } return $this->$member; } } }; $f = new Foo(); $f->magic("Name", "Something"); echo $f->magic("Name") , "\n"; // error $f->magic("Fame", "Something"); echo $f->magic("Fame") , "\n"; ?> 

यह क्या कार्य करता है यह जांचता है कि अगर संपत्ति उसके किसी भी बच्चे के इस वर्ग पर मौजूद होती है, और यदि ऐसा होता है तो अन्यथा यह शून्य हो जाता है। तो अब गुण वैकल्पिक और गतिशील हैं।

 /** * check if property is defined on this class or any of it's childes and return it * * @param $property * * @return bool */ private function getIfExist($property) { $value = null; $propertiesArray = get_object_vars($this); if(array_has($propertiesArray, $property)){ $value = $propertiesArray[$property]; } return $value; } 

उपयोग:

 const CONFIG_FILE_PATH_PROPERTY = 'configFilePath'; $configFilePath = $this->getIfExist(self::CONFIG_FILE_PATH_PROPERTY); 

अगर कोई अन्य अज्ञात गहराई की गहरी संपत्ति खोजना चाहता है, तो मैं सभी बच्चों के सभी ज्ञात गुणों के माध्यम से लूप की आवश्यकता के बिना नीचे के साथ आया।

उदाहरण के लिए, $ Foo-> बार-> बाज़, या $ Foo-> baz, या $ Foo-> बार-> बाज़-> डेव को खोजने के लिए, जहां $ पथ 'foo / bar / baz' जैसी स्ट्रिंग है

 public function callModule($pathString, $delimiter = '/'){ //split the string into an array $pathArray = explode($delimiter, $pathString); //get the first and last of the array $module = array_shift($pathArray); $property = array_pop($pathArray); //if the array is now empty, we can access simply without a loop if(count($pathArray) == 0){ return $this->{$module}->{$property}; } //we need to go deeper //$tmp = $this->Foo $tmp = $this->{$module}; foreach($pathArray as $deeper){ //re-assign $tmp to be the next level of the object // $tmp = $Foo->Bar --- then $tmp = $Bar->baz $tmp = $tmp->{$deeper}; } //now we are at the level we need to be and can access the property return $tmp->{$property}; } 

और फिर कुछ की तरह कॉल करें:

 $propertyString = getXMLAttribute('string'); // '@Foo/Bar/baz' $propertyString = substr($propertyString, 1); $moduleCaller = new ModuleCaller(); echo $moduleCaller->callModule($propertyString); 
 $classname = "myclass"; $obj = new $classname($params); $variable_name = "my_member_variable"; $val = $obj->$variable_name; //do care about the level(private,public,protected) $func_name = "myFunction"; $val = $obj->$func_name($parameters); 

क्यों संपादित करें: पहले: eval (बुराई) का उपयोग करने के बाद: बिल्कुल नहीं eval इस भाषा में पुराना हो रहा है