2009-09-04 3 views
58

क्या कक्षा में किसी वर्ग के नाम से किसी ऑब्जेक्ट को तत्काल करने के लिए PHP में संभव है, यदि वर्ग का नाम किसी स्ट्रिंग में संग्रहीत है?क्या PHP किसी ऑब्जेक्ट को कक्षा के नाम से स्ट्रिंग के रूप में चालू कर सकता है?

उत्तर

97

हाँ, निश्चित रूप से।

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

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

+1

@user - बहुत सही। मुझे आश्चर्य है कि मैं कम से कम न्यूनतम करने के बजाय सीधे क्यों आया? lol – Ben

+1

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

5

Yes it is:

<?php 

$type = 'cc'; 
$obj = new $type; // outputs "hi!" 

class cc { 
    function __construct() { 
     echo 'hi!'; 
    } 
} 

?> 
-1

भी स्थैतिक:

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

यह प्रश्न का उत्तर नहीं प्रदान करता है। किसी लेखक से स्पष्टीकरण की आलोचना या अनुरोध करने के लिए, अपनी पोस्ट के नीचे एक टिप्पणी छोड़ दें। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/16691553) – Blackbam

+0

@ ब्लैकबैम प्रासंगिक संबंधित पूरक उत्तर। अगर यह उपयोगी है तो कृपया केवल टिप्पणी करें। –

+0

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

0

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

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 

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

$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}(); 
} 
} 

मैं आरईएसटी वेब सेवाओं को बनाने के लिए इस विधि का उपयोग करता हूं।

संबंधित मुद्दे

 संबंधित मुद्दे