क्या PHP के लिए उसी कक्षा में एक विधि को गतिशील रूप से लागू करने का एक तरीका है? मेरे पास वाक्यविन्यास अधिकार नहीं है, लेकिन मैं इसके समान कुछ करना चाह रहा हूं:
$this->{$methodName}($arg1, $arg2, $arg3);
क्या PHP के लिए उसी कक्षा में एक विधि को गतिशील रूप से लागू करने का एक तरीका है? मेरे पास वाक्यविन्यास अधिकार नहीं है, लेकिन मैं इसके समान कुछ करना चाह रहा हूं:
$this->{$methodName}($arg1, $arg2, $arg3);
जवाबों:
ऐसा करने का एक से अधिक तरीका है:
$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 का उपयोग कर सकते हैं
call_user_func_arrayलिए एक है।
call_user_func_array($this->$name, ...)और सोच रहा था कि यह काम क्यों नहीं करेगा!
बस ब्रेसिज़ को छोड़ें:
$this->$methodName($arg1, $arg2, $arg3);
आप ओवरलोडिंग को 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
यदि आप PHP में एक वर्ग के भीतर काम कर रहे हैं, तो मैं PHP5 में ओवरलोड __call फ़ंक्शन का उपयोग करने की सलाह दूंगा। आप यहाँ संदर्भ पा सकते हैं ।
मूल रूप से __call गतिशील कार्यों के लिए करता है जो OO PHP5 में चर के लिए __set और __get करते हैं।
इन सभी वर्षों के बाद भी मान्य है! सुनिश्चित करें कि यदि आप उपयोगकर्ता द्वारा परिभाषित सामग्री है, तो आप $ पद्धति को ट्रिम कर दें। मुझे यह काम नहीं मिल सका -> $ मेथडनाम काम करने के लिए जब तक मैंने देखा कि यह एक अग्रणी स्थान नहीं था।
आप एक वैरिएबल को बंद करके एक विधि को स्टोर कर सकते हैं:
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 के साथ संगत है। एक और उदाहरण यहाँ