PHP में डायनामिक क्लास मेथड इनवोकेशन


87

क्या PHP के लिए उसी कक्षा में एक विधि को गतिशील रूप से लागू करने का एक तरीका है? मेरे पास वाक्यविन्यास अधिकार नहीं है, लेकिन मैं इसके समान कुछ करना चाह रहा हूं:

$this->{$methodName}($arg1, $arg2, $arg3);

क्या यह मूल प्रश्न था? मैं एक विधि को गतिशील रूप से लागू करने के लिए देख रहा था और मुझे यह प्रश्न मिला। यह andy.gurin द्वारा दिया गया एक ही वाक्यविन्यास है और मुझे एक लिंक नहीं दिखता है जो प्रश्न पर अद्यतन दिखाता है। वैसे भी ... योगदानकर्ताओं के लिए धन्यवाद और धन्यवाद करने के लिए धन्यवाद :-)
लुक एम

5
@Luc - यह मूल प्रश्न था। यह पता चला है कि मेरे कहने पर मुझे वाक्यविन्यास सही था, लेकिन मेरे कोड के साथ कुछ और गलत था, इसलिए यह काम नहीं किया।
वर्चुओसीमीडिया जूल

जवाबों:


175

ऐसा करने का एक से अधिक तरीका है:

$this->{$methodName}($arg1, $arg2, $arg3);
$this->$methodName($arg1, $arg2, $arg3);
call_user_func_array(array($this, $methodName), array($arg1, $arg2, $arg3));

तुम भी प्रतिबिंब एपीआई http://php.net/manual/en/class.reflection.php का उपयोग कर सकते हैं


मुझे लगता है कि शायद मेरे पास वाक्यविन्यास सही था, इसलिए मेरे कोड में कुछ और गलत है क्योंकि यह सही ढंग से काम नहीं कर रहा है। हम्म ...
VirtuosiMedia

थके हुए के लिए एक शब्द, अगर आपके तरीकों को ऑब्जेक्ट पर बुलाया जा रहा है और PHPUnit के साथ परीक्षण किया गया है, तो आपके call_user_func_arrayलिए एक है।
ठीक है यकीन है कि

तुम मेरे दोस्त, बस मेरा दिन बचा लिया! मैं फोन कर रहा था call_user_func_array($this->$name, ...)और सोच रहा था कि यह काम क्यों नहीं करेगा!
पबदु डोडांगोडा


10

आप ओवरलोडिंग को PHP में इस्तेमाल कर सकते हैं: ओवरलोडिंग

class Test {

    private $name;

    public function __call($name, $arguments) {
        echo 'Method Name:' . $name . ' Arguments:' . implode(',', $arguments);
        //do a get
        if (preg_match('/^get_(.+)/', $name, $matches)) {
            $var_name = $matches[1];
            return $this->$var_name ? $this->$var_name : $arguments[0];
        }
        //do a set
        if (preg_match('/^set_(.+)/', $name, $matches)) {
            $var_name = $matches[1];
            $this->$var_name = $arguments[0];
        }
    }
}

$obj = new Test();
$obj->set_name('Any String'); //Echo:Method Name: set_name Arguments:Any String
echo $obj->get_name();//Echo:Method Name: get_name Arguments:
                      //return: Any String


3

यदि आप PHP में एक वर्ग के भीतर काम कर रहे हैं, तो मैं PHP5 में ओवरलोड __call फ़ंक्शन का उपयोग करने की सलाह दूंगा। आप यहाँ संदर्भ पा सकते हैं ।

मूल रूप से __call गतिशील कार्यों के लिए करता है जो OO PHP5 में चर के लिए __set और __get करते हैं।


2

इन सभी वर्षों के बाद भी मान्य है! सुनिश्चित करें कि यदि आप उपयोगकर्ता द्वारा परिभाषित सामग्री है, तो आप $ पद्धति को ट्रिम कर दें। मुझे यह काम नहीं मिल सका -> $ मेथडनाम काम करने के लिए जब तक मैंने देखा कि यह एक अग्रणी स्थान नहीं था।


यदि यह उपयोगकर्ता द्वारा परिभाषित सामग्री है, तो सुनिश्चित करें कि आप नाम को ट्रिम करने की तुलना में बहुत अधिक करते हैं! जैसे कि ... सुरक्षा जांच! ;)
एरक

इंटरनेट पर कहीं भी, मैंने विस्तृत किया कि उपयोगकर्ता ने utf8 को विंडोज़-सुरक्षित वर्णों में कैसे परिवर्तित किया जाए। क्विकबुक ने मुझे उस झुर्री के माध्यम से दौड़ाया - और क्यूबी अब इस बात का हिस्सा नहीं है कि मैं पूरी बिक्री कैसे करूं ...
क्रिस के

क्या आप वास्तव में क्लाइंट को एक इनपुट निर्दिष्ट करने की अनुमति दे रहे हैं, जो गतिशील रूप से कुछ विधियों को कहते हैं! " मेरे पास कोई शब्द नहीं है
मैक्स्की

स्पष्ट रूप से मान्य और जाँच की गई कि कक्षा में वास्तव में इस तरह की नामित पद्धति है। मूल्य की जांच करने के कई तरीके हैं। यह एक लंबा स्विच स्टेटमेंट धड़कता है।
स्नैपडील

1

मेरे मामले में।

$response = $client->{$this->requestFunc}($this->requestMsg);

PHP सोप का उपयोग करना।


2
मुझे यकीन नहीं है लेकिन सुरक्षा के मुद्दे पर सावधान रहना चाहिए
tom10271

1

आप एक वैरिएबल को बंद करके एक विधि को स्टोर कर सकते हैं:

class test{        

    function echo_this($text){
        echo $text;
    }

    function get_method($method){
        $object = $this;
        return function() use($object, $method){
            $args = func_get_args();
            return call_user_func_array(array($object, $method), $args);           
        };
    }
}

$test = new test();
$echo = $test->get_method('echo_this');
$echo('Hello');  //Output is "Hello"

संपादित करें: मैंने कोड संपादित कर लिया है और अब यह PHP 5.3 के साथ संगत है। एक और उदाहरण यहाँ

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