PHP에서 동적 클래스 메서드 호출


88

PHP에 대해 동일한 클래스에서 동적으로 메소드를 호출하는 방법이 있습니까? 구문이 맞지 않지만 다음과 비슷한 작업을 수행하려고합니다.

$this->{$methodName}($arg1, $arg2, $arg3);

원래 질문 이었습니까? 동적으로 메서드 호출을 찾고 있었는데이 질문을 찾았습니다. 그것은 andy.gurin에 의해 주어진 것과 동일한 구문이며 질문에 대한 업데이트를 보여주는 링크가 보이지 않습니다. 어쨌든 ... 덕분에 물어 것으로 감사 명의 참여자 :-)에
뤽 M

5
@Luc-원래 질문이었습니다. 내가 물었을 때 구문이 올바른 것으로 밝혀졌지만 내 코드에 다른 문제가있어서 작동하지 않았습니다.
VirtuosiMedia

답변:


176

이를 수행하는 방법은 여러 가지가 있습니다.

$this->{$methodName}($arg1, $arg2, $arg3);
$this->$methodName($arg1, $arg2, $arg3);
call_user_func_array(array($this, $methodName), array($arg1, $arg2, $arg3));

리플렉션 API http://php.net/manual/en/class.reflection.php를 사용할 수도 있습니다 .


나는 구문이 옳았을 것 같아서 제대로 작동하지 않기 때문에 내 코드에 다른 문제가 있습니다. 흠 ...
VirtuosiMedia

메소드가 객체에서 호출되고 PHPUnit으로 테스트되는 경우 지친 한마디가 call_user_func_array당신을위한 것입니다.
OK 확실히

당신은 내 친구, 방금 내 하루를 구했습니다! 나는 전화를 걸어 call_user_func_array($this->$name, ...)왜 작동하지 않을지 궁금했습니다!
Pubudu Dodangoda


10

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


3

PHP의 클래스 내에서 작업하는 경우 PHP5에서 오버로드 된 __call 함수를 사용하는 것이 좋습니다. 여기 에서 참조를 찾을 수 있습니다 .

기본적으로 __call은 OO PHP5의 변수에 대해 __set 및 __get이 수행하는 작업을 동적 함수에 대해 수행합니다.


2

수년이 지난 후에도 여전히 유효합니다! 사용자 정의 콘텐츠 인 경우 $ methodName을 잘라야합니다. $ this-> $ methodName에 선행 공백이 있음을 알 때까지 작동하지 못했습니다.


사용자 정의 콘텐츠 인 경우 이름을 다듬는 것 이상을 수행해야합니다! 예를 들어 ... 보안 검사! )
ERK

인터넷 어딘가에서 사용자가 입력 한 utf8을 Windows 안전 문자로 변환하는 방법을 자세히 설명했습니다. QuickBooks에 그 시련을 통해 저를 실행 - 그리고 QB이의 더 이상 부분은없는 이유를 어떻게 완전 판매 ...
크리스 K

정말 클라이언트가 입력을 지정하도록 허용하고 있습니까? 동적으로 일부 메서드를 호출합니까?! 나는 말이 없다
Mcsky

클래스에 실제로 이러한 명명 된 메서드가 포함되어 있는지 확실히 확인하고 확인했습니다. 값을 확인하는 방법에는 여러 가지가 있습니다. 긴 switch 문을 능가합니다.
Snapey

1

나의 경우에는.

$response = $client->{$this->requestFunc}($this->requestMsg);

PHP SOAP 사용.


2
잘 모르겠지만 보안 문제에주의하세요
tom10271

1

클로저를 사용하여 단일 변수에 메서드를 저장할 수 있습니다.

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과 호환됩니다. 여기에 또 다른 예

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.