क्या PHP किसी स्ट्रिंग के रूप में क्लास के नाम से ऑब्जेक्ट को इंस्टेंट कर सकता है?


83

क्या PHP में किसी वर्ग के नाम से किसी वस्तु को तुरंत भेजना संभव है, यदि कक्षा का नाम स्ट्रिंग में संग्रहीत है?

जवाबों:


138

हां, जरूर।

$className = 'MyClass';
$object = new $className; 

7
कूल, मुझे यह पूछने से पहले परीक्षण करना चाहिए था कि हे। धन्यवाद!
user135295

2
@user - बहुत सही। मुझे आश्चर्य है कि मैं नंगे न्यूनतम करने के बजाय सीधे एसओ क्यों आया? लोल
बेन

2
वास्तव में यह इतना स्पष्ट नहीं है। मुझे पता है कि जावा में यह प्रतिबिंब नामक एक चीज है, लेकिन इसकी तुलना में यह बहुत सरल है।
बार्टिस Bartron

4
यदि clsss नेमस्पेस में है, तो इस $ वर्ग = 'PrintData \\' का उपयोग करें। $ वर्ग; नया $ वर्ग वापस करें ();
दारीक्स

2
इसके अलावा, जैसा कि PHP डॉक्टर बताता है, यदि आप जिस क्लास को इंस्टेंट करना चाहते हैं वह किसी नेमस्पेस के भीतर है तो आपको FQN (पूरी तरह से क्वालिफाइड नाम) निर्दिष्ट करना होगा। उदाहरण के लिए, मैं स्वयं "App \ Http \ Controllers" के एक नामस्थान के भीतर था और मेरे पास एक स्ट्रिंग $ string = 'App \ मॉडल \ Task' थी; मैंने सोचा था कि अगर मैंने स्ट्रिंग को तुरंत करने की कोशिश की, तो यह टूट जाएगा लेकिन वास्तव में, आपको शुरुआत में एक एपेंड करने की आवश्यकता नहीं है।
मैट कीरन


5

यदि आपकी कक्षा को तर्कों की आवश्यकता है, तो आपको यह करना चाहिए:

class Foo 
{
   public function __construct($bar)
   {
      echo $bar; 
   }
}

$name = 'Foo';
$args = 'bar';
$ref = new ReflectionClass($name);
$obj = $ref->newInstanceArgs(array($args));

3

स्थैतिक भी:

$class = 'foo';
return $class::getId();

यह प्रश्न का उत्तर प्रदान नहीं करता है। किसी लेखक से स्पष्टीकरण मांगने या उसका अनुरोध करने के लिए, उनके पोस्ट के नीचे एक टिप्पणी छोड़ दें। - समीक्षा से
ब्लैकबम

@Blackbam प्रासंगिक संबंधित पूरक उत्तर। कृपया उपयोगी होने पर ही टिप्पणी करें।
एंड्रयू एटकिंसन

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

0

आप एक स्टोरेज जैसे डेटाबेस में अपने classname (s) / विधियों को संग्रहीत करके कुछ गतिशील आह्वान कर सकते हैं। यह मानते हुए कि वर्ग त्रुटियों के लिए लचीला है।

sample table my_table
    classNameCol |  methodNameCol | dynamic_sql
    class1 | method1 |  'select * tablex where .... '
    class1 | method2  |  'select * complex_query where .... '
    class2 | method1  |  empty use default implementation

आदि .. फिर अपने कोड में वर्गों और विधियों के नामों के लिए डेटाबेस द्वारा लौटाए गए स्ट्रिंग्स का उपयोग करें। यदि आप अपनी कल्पना तक अपनी कक्षाओं के लिए sql क्वेरी स्टोर कर सकते हैं, तो स्वचालन का स्तर भी।

$myRecordSet  = $wpdb->get_results('select * from my my_table')

if ($myRecordSet) {
 foreach ($myRecordSet   as $currentRecord) {
   $obj =  new $currentRecord->classNameCol;
   $obj->sql_txt = $currentRecord->dynamic_sql;
   $obj->{currentRecord->methodNameCol}();
}
}

मैं इस विधि का उपयोग REST वेब सेवाएँ बनाने के लिए करता हूँ।


1
और अगर मैं किसी भी संख्या में वर्गों और विधियों के साथ आपके डेटाबेस को इंजेक्ट करने का प्रबंधन करता हूं, तो मेरे पास आपका संपूर्ण एपीआई .... कुडोस है! कृपया इस कोड का उपयोग न करें, यह बहुत खतरनाक है!
जेम्स किपलिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.