एक स्ट्रिंग के साथ PHP वर्ग उदाहरण बनाना


223

मेरे पास दो कक्षाएं हैं, class ClassOne { }और class ClassTwo {}। मुझे एक स्ट्रिंग मिल रही है जो "One"या तो हो सकती है "Two"

एक लंबे switchबयान का उपयोग करने के बजाय जैसे:

switch ($str) {
    case "One":
        return new ClassOne();
    case "Two":
        return new ClassTwo();
}

वहाँ एक तरह से मैं एक स्ट्रिंग का उपयोग कर एक उदाहरण बना सकते हैं, यानी है new Class("Class" . $str);?

जवाबों:


484

हाँ तुम कर सकते हो!

$str = 'One';
$class = 'Class'.$str;
$object = new $class();

नामस्थान का उपयोग करते समय, पूरी तरह से योग्य नाम की आपूर्ति करें :

$class = '\Foo\Bar\MyClass'; 
$instance = new $class();

अन्य अच्छे सामान जो आप php में कर सकते हैं वे हैं:
परिवर्तनीय चर :

$personCount = 123;
$varname = 'personCount';
echo $$varname; // echo's 123

और चर कार्यों और विधियों।

$func = 'my_function';
$func('param1'); // calls my_function('param1');

$method = 'doStuff';
$object = new MyClass();
$object->$method(); // calls the MyClass->doStuff() method. 

1
उदाहरण के लिए धन्यवाद!
जोएल

28
FYI करें, आप आंशिक रूप से एक चर का उपयोग नहीं कर सकते हैं। जैसे। $my_obj = Package\$class_name();। इसके बजाय आपको$class_name = "Package\\" . $class_name; $my_obj = new $class_name();
बिरला

14
कृपया ध्यान दें कि नेमस्पेस का उपयोग करते समय, आपको पूर्ण पथ की आपूर्ति करनी चाहिए:$className = '\Foo\Bar\MyClass'; $instance = new $className();
Giel Berkers

5
कोई चम्मच नहीं है ... केवल php।
कप्तान हाइपरटेक्स्ट

4
लेकिन एक सवाल। ऊपर वर्णित विधि का उपयोग एक नया वर्ग उदाहरण बनाने के लिए किया जा सकता है। क्या होगा यदि मैं एक मौजूदा कक्षा की विधि को सांख्यिकीय रूप से कॉल करना चाहता हूं? : मैं इस प्रकार की कोशिश की $model = $user_model::find()->All(); है, जहां $user_modelके वर्ग की स्ट्रिंग वाली चर बुलाया जा रहा है
रमेश पारीक

22

आप बस एक नया वर्ग बनाने के लिए निम्नलिखित सिंटैक्स का उपयोग कर सकते हैं (यदि आप एक कारखाना बना रहे हैं तो यह आसान है ):

$className = $whatever;
$object = new $className;

एक अपवाद के रूप में (असाधारण क्रूड) उदाहरण फैक्टरी विधि:

public function &factory($className) {

    require_once($className . '.php');
    if(class_exists($className)) return new $className;

    die('Cannot create new "' . $className . '" class - includes not found or class unavailable.');
}

1
क्या आपको क्लास के नाम और एक्सटेंशन के बीच कोई बिंदी नहीं है? require_once($className.'php'); ->require_once($className.'.php');
जे क्वेस्ट


4

मान लें कि ClassOneइसे इस प्रकार परिभाषित किया गया है:

public class ClassOne
{
    protected $arg1;
    protected $arg2;

    //Contructor
    public function __construct($arg1, $arg2)
    {
        $this->arg1 = $arg1;
        $this->arg2 = $arg2;
    }

    public function echoArgOne
    {
        echo $this->arg1;
    }

}

PHP प्रतिबिंब का उपयोग करना;

$str = "One";
$className = "Class".$str;
$class = new \ReflectionClass($className);

एक नया उदाहरण बनाएँ:

$instance = $class->newInstanceArgs(["Banana", "Apple")]);

एक विधि को बुलाओ:

$instance->echoArgOne();
//prints "Banana"

एक चर का प्रयोग विधि के रूप में करें:

$method = "echoArgOne";
$instance->$method();

//prints "Banana"

किसी वस्तु को बनाने के लिए सिर्फ कच्चे तार का उपयोग करने के बजाय परावर्तन का उपयोग करने से आपको अपनी वस्तु और बेहतर परीक्षण क्षमता पर बेहतर नियंत्रण मिलता है (PHPUnit परावर्तन पर बहुत निर्भर करता है)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.