गतिशील रूप से स्ट्रिंग के आधार पर PHP ऑब्जेक्ट बनाएं




mysql oop (4)

मैं एक MySQL डेटाबेस में एक स्ट्रिंग द्वारा परिभाषित प्रकार के आधार पर PHP में एक ऑब्जेक्ट बनाना चाहता हूं। डेटाबेस तालिका में कॉलम और नमूना डेटा है:

 id | type | propertyVal
----+------+-------------
  1 | foo  | lorum
  2 | bar  | ipsum

... PHP डेटा प्रकार के साथ

class ParentClass {...}
class Foo extends ParentClass {private $id, $propertyVal; ...}
class Bar extends ParentClass {private $id, $propertyVal; ...} 
//...(more classes)...

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

मैं सोच रहा था कि इसका उपयोग कर:

  1. mysql_fetch_object()
  2. प्रकार विशेषता पढ़ना
  3. टाइप एट्रिब्यूट द्वारा परिभाषित प्रकार के साथ ऑब्जेक्ट बनाना

लेकिन एक स्ट्रिंग के आधार पर गतिशील रूप से एक प्रकार बनाने के लिए कोई रास्ता नहीं पता है। कोई इसे कैसे करता है?


लेकिन एक स्ट्रिंग के आधार पर गतिशील रूप से एक प्रकार बनाने के लिए कोई रास्ता नहीं पता है। कोई इसे कैसे करता है?

आप इसे आसानी से और स्वाभाविक रूप से कर सकते हैं:

$type = 'myclass';

$instance = new $type;

यदि आपकी क्वेरी एक एसोसिएटिव सरणी लौट रही है, तो आप समान सिंटैक्स का उपयोग करके गुण असाइन कर सकते हैं:

// build object
$type = $row['type'];
$instance = new $type;

// remove 'type' so we don't set $instance->type = 'foo' or 'bar'
unset($row['type']);  

// assign properties
foreach ($row as $property => $value) {
   $instance->$property = $value;
}

एक बहुत साफ वाक्यविन्यास है जिसका आप उपयोग कर सकते हैं जिसे मैंने कुछ महीने पहले सीखा था जो अस्थायी चर पर भरोसा नहीं करता है। यहां एक उदाहरण दिया गया है जहां मैं एक विशिष्ट वर्ग लोड करने के लिए POST चर का उपयोग करता हूं:

$eb = new ${!${''} = $_POST['entity'] . 'Binding'}();

हालांकि आपके विशिष्ट मामले में, आप पीडीओ का उपयोग करके इसे हल करने में सक्षम होंगे। इसमें एक लांच मोड है जो पहले कॉलम के मान को उस पंक्ति के रूप में सक्षम करता है जो पंक्ति को तत्काल करता है।

$sth->fetch(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE);

जब मैं इस धागे पर आया था तब नीचे मैं क्या देख रहा था। एक स्ट्रिंग के रूप में ऑब्जेक्ट नाम घोषित या संदर्भित करने के लिए {"objectName"} (ब्रैकेट) का उपयोग करें।

         $gameData = new stdClass();
     $gameData->location = new stdClass();
    $basementstring = "basement";
    class tLocation {

              public $description;

              }

         $gameData->location->{'darkHouse'} = new tLocation;
        $gameData->location->{"darkHouse"}->description = "You walkinto a dusty old house";


  $gameData->location->{$basementstring} = new tLocation;
   $gameData->location->{"basement"}->description = "its really damp down here.";

    //   var_dump($gameData); 
   echo $gameData->location->basement->description;

ऑब्जेक्ट का जिक्र करने का यह तरीका अदला-बदली लगता है। मुझे जवाब नहीं मिला, इसलिए मुझे इसके साथ बेवकूफ़ बनाना पड़ा जब तक कि मुझे कोई रास्ता नहीं मिला।


$instance = new $classname; // i.e. $type in your case

बहुत अच्छी तरह से काम करता है ...





casting