2009-10-09 23 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はどのようにクラスインスタンスを「呼び出す」のですか?

答えて

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

あなたのクラスのコンストラクタが可変数の引数を受け入れ、そしてあなたは、配列(call_user_func_arrayの一種)でこれらの引数を保持している場合しかし、あなたはリフレクションを使用する必要があります。

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

ありまたReflectionClass::newInstanceですが、上記の最初のオプションと同じことを行います。

参考:

+0

ああ、それは簡単です。 :-D 質問がもう1つあります。そのクラスが実際に存在するかどうかをテストする方法はありますか? Like: if(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"; 

代わりに、反射を使用することもできます。これはまた、必要な数がわからない場合に、コンストラクタ引数の配列を提供できることを意味します。

<?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が必要です。今日まで「スプラット」オペレータが存在していたという考えはありませんでした! http://php.net/manual/en/migration56.new-features.php#migration56.new-features.splat – Andy

関連する問題