0

前に別の変数を宣言せずに、文字列からクラスをインスタンス化することは可能ですか?

普通に書き終わりました

$className = 'myClass'
$instance  = new $className();

ただし、たとえば次のように短くすると便利な場合があります

$instance  = new ${'className'}();

目的は、余分な変数を使用せずにループ内で(条件付きで)オブジェクトを作成することです...

編集: $className は動的です。状況を説明するために上記でハードコーディングされています

4

3 に答える 3

2

ファクトリ パターンを参照してください。

class Foo {
    static function factory($class, array $args = null) {
        return new $class($args);
    }
}

// class factoring; returns a new instance of requested class ($className)
Foo::factory($className);

一部のクラス プロパティを設定する場合は、オプションの引数配列を追加しました。

// pass some values for class constructor
Foo::factory($className, array('arg1' => 1, 'arg2' => 2, 'args3' => 3));

さらに、そのパターンを使用するときにメソッドを「連鎖」できるように、「流動的な」インターフェースを構築できます。

Foo::factory($className)->method1()->method2(array('param' => 'value'))->etc();

where method1(), method2()must return $this(オブジェクト自体) は、複数のメソッド呼び出しを 1 行で連鎖させる必要があります。

于 2012-07-21T10:44:40.430 に答える
1

これは 1 つの余分な変数ですが、実際に大きな違いがあるのでしょうか? 答えは、(セキュリティ上の問題を伴う) eval を使用しない限り、最初の例よりも短くすることはできないということです。

于 2012-07-20T19:45:54.207 に答える
1

クラス名をパラメーターとして受け取るファクトリ関数 (またはクラス/メソッド) を作成し、文字列を生成する動的 PHP コードの結果を使用してそれを呼び出すことができます。少しきれいだと思うかもしれませんが、メモリや速度を節約することはできません。

class foo { }
function factory($class) { return new $class(); }

foreach (...) {
    $instance = factory(<some code that returns the string 'foo'>);
}
于 2012-07-20T19:59:30.030 に答える