Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

PDO::FETCH_CLASS कई वर्गों के साथ

जैसा कि आप क्वेरी करने से पहले लौटाई गई वस्तुओं के प्रकार (वर्गनाम) को नहीं जानते हैं, आप इसे निर्दिष्ट नहीं कर सकते।

हालाँकि, आप उस तर्क को किसी अन्य प्रकार के अंदर समाहित कर सकते हैं जिसे आप रिटर्न प्रकार के रूप में उपयोग करते हैं जो तब विशिष्ट रिटर्न प्रकार वापस कर सकता है:

/**
 * Should not have any private, public or protected members in it's definition.
 * 
 * Does only work for public properties.
 */
class ReturnObject {
    public function getConcrete()
    {
        /* decide here which class */
       $classname = 'Child'; // or 'Adult'

       return $this->selfAs($classname);
    }

    private function selfAs($classname)
    {
        $l = strlen(__CLASS__);
        $s = sprintf('O:%d:"%s"', strlen($classname), $classname).substr(serialize($this), 5+strlen($l)+$l);
        $instance = unserialize($s);
        $instance->__construct();
        return $instance;
    }
}

फिर आप getConcrete() . का उपयोग कर सकते हैं आपके विशिष्ट प्रकार, डेटाबेस रिटर्न के लिए बाध्य आपके निर्णय तर्क को वापस करने के लिए प्रत्येक लौटाई गई वस्तु पर कार्य करें।

संपादित करें: मैंने इसे एक ऐसे संस्करण में बदल दिया है जो पहले ऑब्जेक्ट गुणों को unserialize के माध्यम से प्रारंभ करेगा (कृपया परीक्षण करें कि यह काम करता है, यह इस धारणा पर आधारित है कि हम केवल सार्वजनिक संपत्तियों के बारे में बात कर रहे हैं और मुझे नहीं पता कि पीडीओ बस सेटर्स या अधिक करता है या नहीं आपके द्वारा उपयोग किए जा रहे मोड में प्रतिबिंब के माध्यम से) और फिर कंस्ट्रक्टर फ़ंक्शन को कॉल करता है। कंस्ट्रक्टर को सार्वजनिक होना चाहिए (और यह मौजूद होना चाहिए) ताकि यह काम करे।

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

हालाँकि ऐसा करने का यह केवल एक ही तरीका है। आपको शायद केवल एक ->isChild() . की आवश्यकता है या ->isAdult() आपके Person . पर कार्य करता है कक्षा।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. केकफ़्पी 3 में रिकर्सिव?

  2. ऑन क्लॉज में MySQL अज्ञात कॉलम

  3. बाइनरी लॉग से डेटा पढ़ते समय मास्टर से मैसकल त्रुटि 1236

  4. तालिका में प्राथमिक कुंजी नहीं है

  5. कैसे पता करें कि कॉलम नाम विभिन्न डेटाबेस में एक आरक्षित कीवर्ड है या नहीं?