2010-06-22 24 views
8

Có cách nào, trong PHP, để gọi các phương thức từ một lớp cha bằng cách sử dụng đối số tùy ý call_user_func_array? Về cơ bản, tôi muốn viết một chút mã soạn sẵn, trong khi hơi kém tối ưu, sẽ cho phép tôi gọi phụ huynh đến một phương thức tùy tiện như thế này:Sử dụng call_user_function để truy cập vào phương thức cha trong PHP

function childFunction($arg1, $arg2, $arg3 = null) { 
    // I do other things to override the parent here... 

    $args = func_get_args(); 
    call_user_func_array(array(parent, __FUNCTION__), $args); // how can I do this? 
} 

Đây có phải là một hack lạ? Ừ. Tôi sẽ sử dụng bản mẫu này ở nhiều nơi, mặc dù, có thể có lỗi trong việc sao chép phương thức args đúng cách, do đó, sự cân bằng là ít lỗi hơn tổng thể.

+0

Tôi cá rằng việc xây dựng như thế này sẽ dễ gây ra lỗi hơn, bởi vì 'call_user_func_array' và bạn bè có phần kỳ diệu. Một cái gì đó nói với tôi có lẽ là một giải pháp tốt hơn, nhưng vấn đề không đủ rõ ràng để tôi nhìn thấy nó. – Kris

Trả lời

-1

Bạn có thể gọi bất kỳ phương thức nào trên lớp cha, miễn là nó không bị quá tải gần hơn với lớp của cá thể. Chỉ cần sử dụng $this->methodName(...)

Đối với phép thuật hơi cao cấp hơn, đây là một ví dụ làm việc của những gì bạn dường như muốn:

Xin lưu ý rằng tôi không tin rằng đây là một ý tưởng tốt

class MathStuff 
{ 
    public function multiply() 
    { 
     $total = 1; 
     $args = func_get_args(); 
     foreach($args as $order => $arg) 
     { 
      $total = $total * $arg; 
     } 
     return $total; 
    } 
} 
class DangerousCode extends MathStuff 
{ 
    public function multiply() 
    { 
     $args = func_get_args(); 

     $reflector = new ReflectionClass(get_class($this)); 
     $parent = $reflector->getParentClass(); 
     $method = $parent->getMethod('multiply'); 
     return $method->invokeArgs($this, $args); 
    } 
} 


$danger = new DangerousCode(); 
echo $danger->multiply(10, 20, 30, 40); 

Về cơ bản, điều này tra cứu phương thức MathStuff::multiply trong bảng tra cứu phương thức và thực thi mã của nó trên dữ liệu cá thể từ một cá thể DangerousCode.

20

Hãy thử hoặc là một trong

call_user_func_array(array($this, 'parent::' . __FUNCTION__), $args); 

hoặc

call_user_func_array(array('parent', __FUNCTION__), $args); 

... tùy thuộc vào phiên bản PHP của bạn. Những người lớn tuổi có xu hướng sụp đổ một chút, cẩn thận :)

+1

[Cả hai đều sẽ hoạt động trong 'PHP 5.3 +'] (http://3v4l.org/sv4no). Tuy nhiên, trong các phiên bản cũ hơn (cập nhật hệ thống của bạn!), Bạn phải [1. đặt 'func_get_args' thành biến đầu tiên (và không trực tiếp là' call_user_func_array (.., func_get_args()) 'và thứ hai bạn chỉ có thể sử dụng ví dụ đầu tiên.] (http://3v4l.org/iCJ3e) – h2ooooooo

+0

Phương thức đầu tiên ('mảng ($ this, 'parent ::'. __FUNCTION __)') sẽ dẫn đến đệ quy vô hạn nếu bạn mở rộng từ lớp mà bạn sử dụng 'call_user_func_array' để gọi cho cha mẹ, sử dụng phương thức thứ hai, nó hoạt động ok. – cronfy

Các vấn đề liên quan