2012-09-27 5 views
4

나는 arg37의 인덱스 배열을 메서드에 전달할 수있는 곳에서 작업하고 있는데, 이는 call_user_func_array과 매우 유사합니다. 나는 call_user_func_array을 사용할 것이다. 그러나 그것은 바람직하지 않은 OOP 접근법이 아니며, 메소드가 정적이어야하며, 목표 클래스의 객체 지향을 깨뜨린다.클래스 메서드 호출을 동적으로 호출

나는 ReflectionClass을 사용하려고했지만 아무 소용이 없습니다. 클래스의 메서드에 대한 인수는 호출 할 수없고 생성자에 대해서만 호출 할 수 있습니다. 불행히도, 이것은 바람직하지 않습니다.

제가 맨 페이지를 가져다가 ReflectionFunction을 보았습니다.하지만 클래스를 인스턴스화 할 방법이 없으므로 메소드를 가리킨 다음 invokeArgs을 지정하십시오.

Function (Index())->Index() does not exist 

사용 예 ReflectionMethod

$call = new \ReflectionMethod("ExampleClass", "exampleMethod"); 
$call->invokeArgs(new ExampleClass(), ["argument1", "argument2"]); 
print_r($call); 

:

$call = new \ReflectionFunction("(ExampleClass())->exampleMethod"); 
$call->invokeArgs(["argument1", "argument2"]); 

이 실패합니다

ReflectionFunction를 사용하여 (이 질문에 PHP 5.4, 따라서 구문을 태그가 기억) 다음과 함께 실패합니다.

ReflectionMethod Object 
(
    [name] => Index 
    [class] => Index 
) 

인수는 절대로 메서드에 전달되지 않습니다.

원하는 결과는 다음과 같습니다

class ExampleClass() { 
    public function exampleMethod($exampleArg1, $exampleArg2){ 
     // do something here 
     echo "Argument 1: {$exampleArg1}\n"; 
     echo "Argument 2: {$exampleArg2}\n"; 
    } 
} 

$array = [ 'exampleArg1Value', 'exampleArg2Value' ]; 

내가 ExampleClass->exampleMethod()의 인스턴스에 $array을 통과하면, 나는 단지 배열 될 하나 개의 인자를 가질 것이다. 대신, 저는 개별적인 주장을 이끌어 낼 수 있어야합니다.

나는 ReflectorClassReflectorFunction을 호출 할 방법이 있다면 나는 배 모양과 도중에 볼 수 있지만 가능하지는 않다고 생각했다.

이전에이 작업을 수행 한 적이있는 사람이 있습니까?

답변

1

어떤 이유로 든 어딘가에서 뭔가가 닥쳤습니다.

$call = new \ReflectionMethod("ExampleClass", "exampleMethod"); 
$call->invokeArgs(new ExampleClass(), ["argument1", "argument2"]); 

지금 내가 문제를 재현하려고 하겠어

Argument 1: argument1 
Argument 2: argument2 

반환합니다. 그것은 php-cli와 fpm으로 5.4.7의 새로운 PHP를 설치합니다.

+0

그래, 그냥 작동해야합니다, 당신은 쉽게 여기 PHP 버전에 대해 확인할 수 있습니다 : http://3v4l.org/JUKK9#v547 - 클래스가 다른 네임 스페이스 또는 뭔가에서 조심하세요. – hakre

5

AFAIK, 다음과 같은 작업을해야합니다 : PHP 마이너 버전은 무엇

$call = new \ReflectionMethod("ExampleClass", "exampleMethod"); 
$call->invokeArgs(new ExampleClass(), ["argument1", "argument2"]); 
print_r($call); 

입니까? 5.4.7에 있니?

+0

예, 현재 5.4.7입니다. –

3

필자는 자신의 의존성 인젝터를 작성했으며 매개 변수가 동적으로 구성된 클래스도 작성합니다. 다음은 진행할 코드입니다.

$type = 'ExampleClass'; 

$reflector = new \ReflectionClass($type); 

if (!$reflector->isInstantiable()) 
    throw new \Exception("Resolution target [$type] is not instantiable."); 

$constructor = $reflector->getConstructor(); 

$parameters = $constructor->getParameters(); 

이 시점에서 구성에 필요한 매개 변수 배열이 있습니다. 이제 매개 변수를 값으로 대체하고 클래스를 구성 할 수 있습니다.

+0

감사! 클래스를 작성하는 대신 메소드를 호출하는 방법을 찾고 있습니다. 당신이 주었던 것을 가지고 놀아 볼 것입니다. –

관련 문제