2010-06-22 4 views
8

PHP에서 임의의 인수 call_user_func_array을 사용하여 부모 클래스의 메서드를 호출 할 수있는 방법이 있습니까?call_user_function을 사용하여 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? 
} 

이 홀수 해킹 : 기본적으로, 나는 약간 덜 최적의 동안, 저 같은 임의의 방법에 부모를 호출하게됩니다, 상용구 코드가 조금 쓰고 싶어요? 네. 그러나이 메소드는 많은 부분에서이 보일러 플레이트를 사용할 것입니다. 메소드 arg를 제대로 옮겨 놓는 데 오류가있을 수 있기 때문에 전체적인 버그를 줄이는 것이 좋습니다.

+0

'call_user_func_array'와 친구들은 다소 마술 적이기 때문에 이런 구조가 버그를 일으킬 확률이 높습니다. 뭔가 더 나은 해결책이 있음을 나에게 알려주지 만 문제는 그것을보기에 충분하지 않습니다. – Kris

답변

-1

부모 클래스에서 인스턴스의 클래스에 더 가깝게 오버로드되지 않는 한 모든 메서드를 호출 할 수 있습니다.

내가 좋은 생각

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); 

을 수 있도록이 생각하지 않는다 있습니다 : 그냥 조금 더 고급의 마법 $this->methodName(...)

을 사용, 여기 당신이 원하는 것 무엇에 대한 실무 예제 기본적으로 메서드 조회 테이블에서 MathStuff::multiply 메서드를 조회하고 DangerousCode 인스턴스의 인스턴스 데이터에서 해당 코드를 실행합니다.

20

는 PHP 버전에 따라 ... 중

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

중 하나

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

보십시오. 이전 것들은 약간주의 깊게 충돌하는 경향이 있습니다.

+1

[둘 다'PHP 5.3 +'] (http://3v4l.org/sv4no)에서 작동합니다. 그러나 이전 버전 (시스템 업데이트!)에서 [1. 'func_get_args'를 먼저 변수로 설정하고 ('call_user_func_array (.., func_get_args()) '로 직접하지 말고 둘째로 첫 번째 예제 만 사용할 수 있습니다.] (http://3v4l.org/iCJ3e) – h2ooooooo

+0

첫 번째 방법 ('array ($ this, 'parent ::'. __FUNCTION __)')는 call_user_func_array를 사용하는 클래스에서 부모 클래스를 확장하면 무한 재귀 호출로 이어질 것이다. – cronfy

관련 문제