जैसा कि आप क्वेरी करने से पहले लौटाई गई वस्तुओं के प्रकार (वर्गनाम) को नहीं जानते हैं, आप इसे निर्दिष्ट नहीं कर सकते।
हालाँकि, आप उस तर्क को किसी अन्य प्रकार के अंदर समाहित कर सकते हैं जिसे आप रिटर्न प्रकार के रूप में उपयोग करते हैं जो तब विशिष्ट रिटर्न प्रकार वापस कर सकता है:
/**
* 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
. पर कार्य करता है कक्षा।