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




oop casting (5)

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

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

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

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

मैं एक 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. टाइप एट्रिब्यूट द्वारा परिभाषित प्रकार के साथ ऑब्जेक्ट बनाना

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


जब मैं इस धागे पर आया था तब नीचे मैं क्या देख रहा था। एक स्ट्रिंग के रूप में ऑब्जेक्ट नाम घोषित या संदर्भित करने के लिए {"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;

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


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

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

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

एक प्रश्न के साथ (आपको कक्षा का नाम पहले फ़ील्ड का नाम देना होगा):

$stmt = $db->prepare('SELECT type,id,propertyVal FROM table WHERE id=1');
$stmt->execute();
$foo = $stmt->fetch(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE);
var_dump($foo); // $foo is a newly created object of class foo, with properties named like and containing the value of subsequent fields

यह अच्छा है लेकिन यह थोड़ी देर के साथ कूलर हो जाता है

$stmt = $db->prepare('SELECT type,id,propertyVal FROM table');
$stmt->execute();
while ($object = $stmt->fetch(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE))
 {var_dump($object);} // here all desired objects, dynamically constructed accordingly to the first column returned by the query

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

class foo
 {function __construct ()
   {$this->uper = strtoupper($this->propertyVal);}}

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

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


unset($array[$index]);




php mysql oop casting