दिलचस्प पोस्ट
आंत के लिए arc4random () के परिणाम कास्टिंग करते समय क्रैश एक 2 डी संख्यात्मक ऑब्जेक्ट सब्सकेटिंग XAMPP पर अपाचे वर्चुअल होस्ट कैसे सेट करें (विंडोज़) वसंत: मैं एक एचटीपीपीएर्वलेट अनुरोध को एक अनुरोध-स्कॉक्ड बीन में कैसे इंजेक्ट करूँ? उत्कृष्ट उपयोग करने के लिए देर से बंधन का उपयोग कैसे करें? सक्रिय निर्देशिका के साथ .NET में उपयोगकर्ता समूह और भूमिका प्रबंधन स्क्वैश मेरे आखिरी एक्स ने गिट का उपयोग करके एक साथ किया है दूसरे सरणी के दूसरे मंद के सूचकांक के रूप में एक अंडाकार सरणी का उपयोग करना? क्या आईओएस एप्लीकेशन में वैकल्पिक आइकन लागू करना संभव है? कैसे ArrayIndexOutOfBoundsException या IndexOutOfBoundsException से बचने के लिए? जांचें कि संपादन टेक्स्ट खाली है या नहीं। HTML में फ़ॉन्ट कैसे एम्बेड करें? क्या एक फ़ंक्शन के लिए कई मूल्यों को वापस करने के लिए अजगर है? जावा में पाइप (|) ऑपरेटर गिट वर्जनिंग का उपयोग करते हुए फ़ाइल का परिवर्तन इतिहास देखें

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

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

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

की तरह होगा…

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

वेब के समाधान से एकत्रित समाधान "स्ट्रिंग द्वारा 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 इस भाषा में पुराना हो रहा है