2016-09-27 3 views
0

클래스를 인스턴스화하면서 한 줄에 PHP 마술을하려고하는데 파서가 나를 허용하지 않는 것 같습니다. 예 :PHP의 동적 클래스 생성

class Test{ 
    private $foo; 
    public function __construct($value){ 
     $this->foo = $value; 
    } 

    public function Bar(){ echo $this->foo; } 
} 

이 분명히 다음과 같이 호출 할 수 있습니다

$c = new Test("Some text"); 
$c->Bar(); // "Some text" 

가 지금은 몇 가지 흥미로운 문자열 조작에서이 인스턴스를하려면이 :

지금
$string = "Something_Test"; 
$s = current(array_slice(explode('_', $string), 1 ,1)); // This gives me $s = "Test"; 

내가 잘 사용하여 인스턴스화 할 수 :

$c = new $s("Some test text"); 
$c->Bar(); // "Someme test text" 

, 나는, (영리한 방법이 있는지 또는) 내가없는 한 줄이는이 작동 할 수있는 이유를 궁금 해요 : 나뿐만 아니라 변수 변수를 사용하여 시도했다

$c = new $current(array_slice(explode('_', $string), 1 ,1))("Some test text"); //Doesn't work 

:

$c = new $$current(array_slice(explode('_', $string), 1 ,1))("Some test text"); //Doesn't work 

그리고 나는 괄호 안에 캡슐화하려고했지만 아무 소용이 없습니다. 유스 케이스가 이상하게 보일지는 모르겠지만 실제로 일을하고 실제로 PHP에서 동적 타이핑 매직 중 일부를 사용하는 것은 흥미 롭다.

tl; dr : 클래스를 인스턴스화하기 위해 문자열 반환 값을 사용하고 싶습니다.

답변

0

이 따라하고 이해하기 정말 어렵 나는 그런 코드를 권장하지 않지만, 당신이 그것을 달성하기 ReflectionClass를 사용할 수 있습니다

class Test { 
    private $foo; 
    public function __construct($value){ 
     $this->foo = $value; 
    } 

    public function Bar(){ echo $this->foo; } 
} 

$string = "Something_Test"; 
$c = (new ReflectionClass(current(array_slice(explode('_', $string), 1 ,1))))->newInstanceArgs(["Some test text"]); 
$c->Bar(); 
+1

우수함! 나는 그것이 가장 가독성이 높은 코드가 아니라는 것에 동의합니다. 이것은 올바른 관심사이지만, 리플렉션을 이해하는 측면에서는 매우 간단합니다. 좁은 용도이기도합니다 (기본적으로 잘 숨겨진 코드 조각으로 특정 라이브러리 주위에 클래스 인스턴스화를 수행하여 해당 라이브러리의 사용법을보다 명확하게 만듭니다). 그것은 짐승처럼 주석을 달고 일하고 있습니다 - 그리고 PHP가 반사 작용을하는 방법을 배웠습니다. 감사! – Dennis