2009-10-09 4 views
5

문자열 표현으로 클래스 인스턴스를 "호출"할 수 있습니까? 내가 코드는 다음과 같이 기대이 경우PHP에서 클래스 인스턴스를 "호출"하는 방법은 무엇입니까?

:

내가 PHP의 SoapClient는 PHP 클래스에 WSDL 요소를 매핑하는 데 사용되는 classMappings의 목록을 허용으로 이것이 가능해야한다 생각
class MyClass { 
    public $attribute; 
} 

$obj = getInstanceOf("MyClass"); //$obj is now an instance of MyClass 
$obj->attribute = "Hello World"; 

. 하지만 SoapClient가 클래스 인스턴스를 "호출하는"방법은 무엇입니까?

$class = new ReflectionClass('MyClass'); 
$args = array('foo', 'bar'); 
$instance = $class->newInstanceArgs($args); 

이 있습니다 : (call_user_func_array의 종류) 클래스 '생성자는 가변 수의 인수를 받아, 당신은 배열에있는 그 인수를 보유하는 경우

답변

22
$class = 'MyClass'; 
$instance = new $class; 

그러나, 당신은 반사를 사용해야합니다 또한 ReflectionClass::newInstance이지만 위의 첫 번째 옵션과 동일한 기능을 수행합니다.

참조 :

+0

아하 탱크. :-D 질문이 하나 더 있습니다. 클래스가 실제로 존재하는지 테스트하는 방법이 있습니까? 설명 : (classExists ("MyClass")) { $ obj = getInstanceOf ("MyClass"); } – NovumCoder

+0

'class_exists()'가 있습니다 : http://www.php.net/manual/en/function.class-exists.php. 두 번째 논의를 지켜보십시오. –

+0

감사합니다. ReflectionClass는 완벽한 솔루션입니다. 글쎄, 이것이 리플렉션이라고 불리는 것을 잊지 않습니다. :-) – NovumCoder

6

생성자에 필요한 인수의 수는 알려진 상수 경우 (다른 사람이 제안대로), 당신이 할 수있는 이 :

$className = 'MyClass'; 
$obj = new $className($arg1, $arg2, etc.); 
$obj->attribute = "Hello World"; 

대신 Reflection을 사용할 수 있습니다. 이것은 또한 필요한 수를 모르는 경우 생성자 인수 배열을 제공 할 수 있음을 의미합니다.

<?php 
$rf = new ReflectionClass('MyClass'); 
$obj = $rf->newInstanceArgs($arrayOfArguments); 
$obj->attribute = "Hello World"; 
6

다른 대답은 PHP < = 5.5에서 작동하지만이 작업은 당신도 반사를 사용하지 않는 경우 PHP 5.6에서 훨씬 더 쉽게 얻을 수 있습니다. 그냥하십시오 :

<?php 

class MyClass 
{ 
    public function __construct($var1, $var2) 
    {} 
} 

$class = "MyClass"; 
$args = ['someValue', 'someOtherValue']; 

// Here's the magic 
$instance = new $class(...$args); 
+0

이 답변은 더 많은 upvotes가 필요합니다. "splat"연산자가 오늘까지 존재했는지 전혀 몰랐습니다! http://php.net/manual/en/migration56.new-features.php#migration56.new-features.splat – Andy

관련 문제