Có cách nào để gọi động một phương thức trong cùng một lớp cho PHP không? Tôi không có đúng cú pháp, nhưng tôi đang tìm cách làm điều gì đó tương tự như sau:
$this->{$methodName}($arg1, $arg2, $arg3);
Có cách nào để gọi động một phương thức trong cùng một lớp cho PHP không? Tôi không có đúng cú pháp, nhưng tôi đang tìm cách làm điều gì đó tương tự như sau:
$this->{$methodName}($arg1, $arg2, $arg3);
Câu trả lời:
Có nhiều cách để làm điều đó:
$this->{$methodName}($arg1, $arg2, $arg3);
$this->$methodName($arg1, $arg2, $arg3);
call_user_func_array(array($this, $methodName), array($arg1, $arg2, $arg3));
Bạn thậm chí có thể sử dụng api phản chiếu http://php.net/manual/en/class.reflection.php
call_user_func_array
là phương pháp dành cho bạn.
call_user_func_array($this->$name, ...)
và tự hỏi tại sao nó không hoạt động!
Chỉ cần bỏ qua các dấu ngoặc nhọn:
$this->$methodName($arg1, $arg2, $arg3);
Bạn có thể sử dụng Overloading trong PHP: Overloading
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
Bạn cũng có thể sử dụng call_user_func()
vàcall_user_func_array()
Nếu bạn đang làm việc trong một lớp học bằng PHP, thì tôi khuyên bạn nên sử dụng hàm __call bị quá tải trong PHP5. Bạn có thể tìm tài liệu tham khảo tại đây .
Về cơ bản __call thực hiện cho các hàm động những gì __set và __get làm cho các biến trong OO PHP5.
Vẫn còn giá trị sau ngần ấy năm! Đảm bảo bạn cắt $ methodName nếu đó là nội dung do người dùng xác định. Tôi không thể làm cho $ this -> $ methodName hoạt động cho đến khi tôi nhận thấy nó có khoảng trắng ở đầu.
Bạn có thể lưu trữ một phương thức trong một biến duy nhất bằng cách sử dụng một bao đóng:
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"
CHỈNH SỬA: Tôi đã chỉnh sửa mã và bây giờ nó tương thích với PHP 5.3. Một ví dụ khác ở đây