PHP में एक चर से एक वर्ग तुरंत?


146

मुझे पता है कि यह सवाल अस्पष्ट लगता है इसलिए मैं इसे एक उदाहरण के साथ और स्पष्ट करूंगा:

$var = 'bar';
$bar = new {$var}Class('var for __construct()'); //$bar = new barClass('var for __construct()');

यही है जो मैं करना चाहता हूं। आपको इसे कैसे करना होगा? मैं बेशक इस तरह से eval () का उपयोग कर सकता है:

$var = 'bar';
eval('$bar = new '.$var.'Class(\'var for __construct()\');');

लेकिन मैं बल्कि eval () से दूर रहूँगा। क्या कोई ऐसा तरीका है जो बिना इवैल्युएशन () के है?

जवाबों:


213

पहले वर्गनाम को एक चर में रखें:

$classname=$var.'Class';

$bar=new $classname("xyz");

यह अक्सर उस तरह का होता है जिसे आप फ़ैक्टरी पैटर्न में लिपटे हुए देखेंगे।

देखें नेमस्पेस और गतिशील भाषा सुविधाओं अधिक जानकारी के लिए।


2
यह मेरा इसे करने का तरीका है। ध्यान दें कि कक्षाओं के भीतर से आप माता-पिता और स्वयं का उपयोग कर सकते हैं।
रोस

1
एक समान नोट पर, आप $ var = 'Name' भी कर सकते हैं; obj $ -> { 'प्राप्त' $ वर।} ();
मारियो

1
अच्छी बात है, हालांकि यह केवल मेथड कॉल के लिए काम करता है न कि कंस्ट्रक्टर्स के लिए
पॉल डिक्सन

12
यदि आप नेमस्पेस के साथ काम करते हैं, तो मौजूदा नेमस्पेस को स्ट्रिंग में रखें:$var = __NAMESPACE__ . '\\' . $var . 'Class';
bastey

@ बस्ती - लेकिन क्यों? मैंने अभी बहुत समय बिताया है, यह पता चलेगा कि नाम के पूर्व नाम के बिना यह काम क्यों नहीं होगा ...
jkulak

72

अगर आप नेमस्पेस का उपयोग करते हैं

अपने निष्कर्षों में, मुझे लगता है कि यह उल्लेख करना अच्छा है कि आप (जहां तक ​​मैं बता सकता हूं) को एक वर्ग के पूर्ण नामस्थान मार्ग की घोषणा करनी चाहिए।

MyClass.php

namespace com\company\lib;
class MyClass {
}

index.php

namespace com\company\lib;

//Works fine
$i = new MyClass();

$cname = 'MyClass';

//Errors
//$i = new $cname;

//Works fine
$cname = "com\\company\\lib\\".$cname;
$i = new $cname;

6
केवल कार्यशील समाधान जब नाम स्थान के साथ बनाने की आवश्यकता होती है, तो आप ही होते हैं। बांटने के लिए धन्यवाद!
टियागो गौवेगा

लेकिन यह सिर्फ अजीब है, यह घोषित नाम स्थान का उपयोग क्यों नहीं करेगा?
यिस्रेल डोव

@YisraelDov हां यह निश्चित रूप से काउंटर सहज है। लेकिन जिस भी कारण से यह इस संदर्भ में अजीब व्यवहार करता है। धन्यवाद php
csga5000

@YisraelDov मुझे लगता है कि ऐसा इसलिए है क्योंकि उस मामले में किसी अन्य नामस्थान से एक वर्ग को तत्काल सिरदर्द देना भारी सिरदर्द होगा। यह भी विचार करें कि चर को पास किया जा सकता है। जब क्लासनाम को एक php फ़ाइल में टेक्स्ट के रूप में लिखा जाता है, जो कोई भी इसे लिखता है वह ठीक से जानता है कि यह किस नामस्थान में लिखा गया है। लेकिन जब फ़ंक्शन के बीच एक चर पारित किया जाता है, तो उस पर चलना एक बुरा सपना होगा। इसके अलावा अगर आप get_class () का उपयोग करते हैं, तो यह FQ क्लासनाम को वापस दे देगा, ताकि इसे सीधे एक चर में संग्रहीत किया जा सके और कहीं भी उपयोग किया जा सके। यदि यह फ़ाइल के नाम स्थान पर निर्भर करता है, तो यह बहुत अच्छी तरह से काम नहीं करेगा।
sbnc.eu

61

डायनेमिक कंस्ट्रक्टर पैरामीटर भी कैसे पास करें

यदि आप कक्षा में डायनामिक कंस्ट्रक्टर पैरामीटर पास करना चाहते हैं, तो आप इस कोड का उपयोग कर सकते हैं:

$reflectionClass = new ReflectionClass($className);

$module = $reflectionClass->newInstanceArgs($arrayOfConstructorParameters);

गतिशील कक्षाओं और मापदंडों पर अधिक जानकारी

PHP> = 5.6

PHP 5.6 के रूप में आप Argument Unpacking का उपयोग करके इसे और भी सरल बना सकते हैं :

// The "..." is part of the language and indicates an argument array to unpack.
$module = new $className(...$arrayOfConstructorParameters);

यह इंगित करने के लिए DisgruntledGoat का धन्यवाद।


7
PHP 5.6 से आपको तर्क unpacking का उपयोग करने में सक्षम होना चाहिए:new $className(...$params)
DisgruntledGoat

29
class Test {
    public function yo() {
        return 'yoes';
    }
}

$var = 'Test';

$obj = new $var();
echo $obj->yo(); //yoes

नहीं, एक अच्छा उदाहरण नहीं है। केवल काम करता है अगर सब कुछ एक ही php फ़ाइल में है।
फ्रालबो

2
2ndGAB को इस टिप्पणी को हटा देना चाहिए। इस सवाल से ऑटोलाडिंग का कोई लेना-देना नहीं है।
जिम मगुइरे

-1

मैं call_user_func()या call_user_func_arrayphp तरीकों की सिफारिश करूंगा । आप उन्हें यहाँ देख सकते हैं ( call_user_func_array , call_user_func )।

उदाहरण

class Foo {
static public function test() {
    print "Hello world!\n";
}
}

 call_user_func('Foo::test');//FOO is the class, test is the method both separated by ::
 //or
 call_user_func(array('Foo', 'test'));//alternatively you can pass the class and method as an array

यदि आपके पास तर्क हैं जो आप विधि से गुजर रहे हैं, तो call_user_func_array()फ़ंक्शन का उपयोग करें ।

उदाहरण।

class foo {
function bar($arg, $arg2) {
    echo __METHOD__, " got $arg and $arg2\n";
}
}

// Call the $foo->bar() method with 2 arguments
call_user_func_array(array("foo", "bar"), array("three", "four"));
//or
//FOO is the class, bar is the method both separated by ::
call_user_func_array("foo::bar"), array("three", "four"));

3
यह उत्तर प्रश्न पर लागू नहीं होता है। OP पूछ रहा है कि एक चर स्ट्रिंग से एक वर्ग (कक्षा __construct पद्धति को गतिशील रूप से ट्रिगर करते हुए) को कैसे वर्गीकृत किया जा सकता है और एक नए चर में CLASS OBJECT प्राप्त कर रहा है - आपकी सलाह कक्षा के मान को लौटा देगी- विधि ([]] 'आप' री कॉलिंग, न कि क्लास ऑब्जेक्ट इसलिए इस मामले के लिए आवेदन नहीं करता है। वापसी मान देखें php.net/manual/en/function.call-user-func-array.php
क्रिस जेएन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.