은 몇 가지 문제가 여기있다보십시오. 메서드 이름 문자열에는 괄호가 있습니다. 따라서 문자열 화 된 메소드와 같은 호출은 작동하지 않습니다.
시도하면 $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 :) 사용자로부터 문자열로 보내진 체인 객체 호출이 정말로 필요하다면, 위의 미니 버전처럼 문자열 파서를 작성하는 것이 정당합니다.
두 가지 일을 동시에하지 않는 것으로. 원하는 것을 선택하십시오 : 메서드 호출 또는 속성 읽기 – Konstantin
왜 그렇게 복잡합니까? – Rizier123
http://stackoverflow.com/questions/24957587/convert-string-to-object-variable-name/24957760#24957760 –