文字列でPHPクラスインスタンスを作成する


223

2つのクラスがclass ClassOne { }ありclass ClassTwo {}ます。"One"またはの文字列を取得しています"Two"

次のswitchような長いステートメントを使用する代わりに:

switch ($str) {
    case "One":
        return new ClassOne();
    case "Two":
        return new ClassTwo();
}

文字列を使用してインスタンスを作成する方法はありますnew Class("Class" . $str);か?

回答:


484

はい、できます!

$str = 'One';
$class = 'Class'.$str;
$object = new $class();

名前空間を使用する場合は、完全修飾名を指定します。

$class = '\Foo\Bar\MyClass'; 
$instance = new $class();

PHPで実行できるその他のクールなものは次のとおり
です

$personCount = 123;
$varname = 'personCount';
echo $$varname; // echo's 123

そして変数関数とメソッド。

$func = 'my_function';
$func('param1'); // calls my_function('param1');

$method = 'doStuff';
$object = new MyClass();
$object->$method(); // calls the MyClass->doStuff() method. 

1
例をありがとう!
Joel

28
参考までに、変数を部分的に使用することはできません。例えば。$my_obj = Package\$class_name();。代わりに、次のことを行う必要があります$class_name = "Package\\" . $class_name; $my_obj = new $class_name();
Birla

14
:名前空間を使用しているとき、あなたは完全なパスを指定する必要がありますのでご注意ください$className = '\Foo\Bar\MyClass'; $instance = new $className();
Giel Berkers

5
スプーンはありません... phpだけです。
キャプテンハイパーテキスト2016年

4
しかし一つの質問。上記のメソッドを使用して、新しいクラスインスタンスを作成できます。既存のクラスのメソッドを静的に呼び出したい場合はどうなりますか?私は次のように試しました:呼び出されているクラスの文字列を含む変数は$model = $user_model::find()->All(); どこ$user_model
ですか

22

次の構文を使用して新しいクラスを作成できます(これは、ファクトリを作成する場合に便利です)。

$className = $whatever;
$object = new $className;

(並外れて粗い)ファクトリーメソッドの例として:

public function &factory($className) {

    require_once($className . '.php');
    if(class_exists($className)) return new $className;

    die('Cannot create new "' . $className . '" class - includes not found or class unavailable.');
}

1
クラス名と拡張子の間のドットをお見逃しなく。require_once($className.'php'); ->require_once($className.'.php');
Jクエスト


4

ClassOne次のように定義されているとしましょう:

public class ClassOne
{
    protected $arg1;
    protected $arg2;

    //Contructor
    public function __construct($arg1, $arg2)
    {
        $this->arg1 = $arg1;
        $this->arg2 = $arg2;
    }

    public function echoArgOne
    {
        echo $this->arg1;
    }

}

PHPリフレクションの使用。

$str = "One";
$className = "Class".$str;
$class = new \ReflectionClass($className);

新しいインスタンスを作成します。

$instance = $class->newInstanceArgs(["Banana", "Apple")]);

メソッドを呼び出す:

$instance->echoArgOne();
//prints "Banana"

メソッドとして変数を使用します。

$method = "echoArgOne";
$instance->$method();

//prints "Banana"

生の文字列を使用してオブジェクトを作成する代わりにReflectionを使用すると、オブジェクトをより適切に制御し、テストしやすくなります(PHPUnitはReflectionに大きく依存しています)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.