2014-12-13 8 views
0

내가 $method 유사한이 코드 특성 $property를 호출하려는 :PHP에서 동적 메서드를 호출하는 방법?

class test 
{ 
    public $property= 5; 
    public function method() 
    { 
     return $this; 
    } 
} 

$text = 'method().property'; 
$array = explode('.', $text); 
$tt = implode('->', $array); 
$object = new test; 
echo $object->$tt; 

을하지만,이 오류가 반환 :

공지 사항 : 정의되지 않은 속성을 : 테스트 : $ 방법을() -> 속성을 ​​ 에/var/www/html/test2.php on line 16

어떻게 해결할 수 있습니까?

+0

두 가지 일을 동시에하지 않는 것으로. 원하는 것을 선택하십시오 : 메서드 호출 또는 속성 읽기 – Konstantin

+0

왜 그렇게 복잡합니까? – Rizier123

+0

http://stackoverflow.com/questions/24957587/convert-string-to-object-variable-name/24957760#24957760 –

답변

0

왜 그렇게 복잡합니까? 나는이 같은 것을 더 많이 본 것 같아요. 그렇지 않으면 내게는 당신이 원하는 더 설명 알려 주시기 바랍니다 :

<?php 

    class test { 
     public $property = 5; 

     public function method() { 
      return $this->property; 
     } 


    } 

    $object = new test; 
    echo $object->method(); 

?> 

출력 :

5 
+2

글쎄,'왜 그렇게 복잡하니? '==>'echo $ object-> property;'public : – DarkBee

+0

@DarkBee Jeah 네가 맞아! 하지만 OP는 여전히 함수가있는 함수를 호출하려고합니다. – Rizier123

+0

음, 어쩌면 OP의 목적은 일부 형식으로 문자열을 파싱하고 인스턴스를 만들고 메서드를 호출하고 속성에 도달하는 것입니다. –

-2

class test 
{ 
    public $property= 5; 
    public function method() 
    { 
    return $this->property; 
    } 
} 

$object = new test; 
$text = $object->method(); 
$array = explode('.', $text); 
$tt = implode('->', $array); 
print_r($tt); 
0

은 몇 가지 문제가 여기있다보십시오. 메서드 이름 문자열에는 괄호가 있습니다. 따라서 문자열 화 된 메소드와 같은 호출은 작동하지 않습니다.

시도하면 $method = 'myMethod()';이라고 가정하면 myMethod()()이라는 정의되지 않은 방법으로 비명을 지릅니다. $obj->$method으로두면이 이름의 속성을 찾지 못합니다.

가장 간단한 해결책은 미리 정의 된 논리를 사용하여 괄호를 제거하는 것입니다 (나중에 인수가 필요할 수 있으므로).

첫 번째 솔루션 ... 그냥 ... 제거 :

여기
class test 
{ 
    public $property= 5; 
    public function method() 
    { 
     return $this; 
    } 
} 

$text = 'method().property'; 
$array = explode('.', $text); 
$array[0] = str_replace("()", "", $array[0]); 

$test = new test(); 
echo $test->$array[0]()->$array[1]; 

출력은 5입니다.

그러나 사용자로부터 기대할 수 있습니다. method(arg1, arg2).property. 그런 다음 :

class test 
{ 
    public $property= 5; 
    public function method($a, $b) 
    { 
     $argsProduct = $a*$b; 
     $this->property += $argsProduct; 
     return $this; 
    } 
} 

$text = 'method(2, 6).property'; 
$array = explode('.', $text); 

$array[0] = str_replace(["(", ")", ","], " ", $array[0]); 
$array[0] = preg_split("/\\s+/", $array[0]); 

$args = array_slice($array[0], 1, count($array[0])-1, true); 

$test = new test(); 
echo call_user_func_array(array($test, $array[0][0]), $args)->$array[1]; 

출력 : 17; // 2 * 6 = 12; 12 + 5 = 17

는 당연히 인수를 추출하기 위해 더 나은 솔루션이있을 수도 있지만 지금 내 마음에 아니에요. 중요한 것은 사용자가 문자열을 보낼 수있는 미리 정의 된 구조를 알아야한다는 것입니다. 그리고, 의무적으로, 사용하지 않을 EVAL :) 사용자로부터 문자열로 보내진 체인 객체 호출이 정말로 필요하다면, 위의 미니 버전처럼 문자열 파서를 작성하는 것이 정당합니다.

관련 문제