9

文字列表現によってクラスインスタンスを「呼び出す」可能性はありますか?

この場合、コードは次のようになります。

class MyClass {
  public $attribute;
}

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

PHPのSoapClientは、WSDL要素をPHPクラスにマップするために使用されるclassMappingsのリストを受け入れるため、これは可能であるに違いないと思います。しかし、SoapClientはどのようにクラスインスタンスを「呼び出す」のでしょうか。

4

3 に答える 3

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

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

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

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

参照:

于 2009-10-09T09:13:14.320 に答える
13

他の答えは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);
于 2015-02-13T15:48:38.817 に答える
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";
于 2009-10-09T09:14:46.283 に答える