1

アプリケーションの残りのクラスにアクセスするクラスXがあります。このアクセスは動的に行われます。以下のサンプルコード(デモはこちら):

<?
class ClassX
{
    var $ClassA;
    var $ClassB;

    function __construct()
    {
        $this->ClassA = new ClassA();
        $this->ClassB = new ClassB();
    }
}

class ClassA
{
    function methodA($param)
    {
        echo $param;
    }
}

class ClassB
{
    function methodB($param)
    {
        echo $param + 1;
    }
}

/*I can do this for class A*/
$class = "ClassA";
$method = "methodA";
$param = array("some text");

/*or this for class B*/
//$class = "ClassB";
//$method = "methodB";
//$param = array(5);


$objX = new ClassX();
$chain = $objX->{$class};
call_user_func_array(array($chain, $method), $param);
?>

もう少し進んで、X内の明示的なオブジェクトインスタンスを取り除くことができるかどうかを考えていました。

上記のコードでは、私はAとBに「行き詰まっています」。

さまざまなモジュールをロードするアプリケーションを構築する方法を探していますが、どのモジュールが直接ロードされるかはわかりません。したがって、明日Cモジュールがある場合は、Xを変更する必要はありません。Bをサポートしなくなった場合も同じことが当てはまります。

私はXでこのようなことを試しました:

    function __get($object)
    {
        $this->$object = new $object();
    }

しかし、その後、無効なコールバックエラーが発生するため、call_user_func_arrayはテーブルから外れていると思います

私が達成しようとしていることを行うことは可能ですか?

解決策

スパイリックはそれを釘付けにしました!__get()で返す必要があるだけです

function __get($object)
{
    $this->$object = new $object();
    return $this->$object;
}

ここに最終的なコード

4

2 に答える 2

2

以前は、ストレージデータに似たものが必要です。コードはこれでライトに見えます:

class ClassX
{
    var classes = array();

    function __construct()
    {
    }
}

そしてゲッター:

function __get($object)
{
    if(!isset($this->classes[$object]))
        $this->classes[$object] = new $object();
    return $this->classes[$object];
}

UPD: その後は使用できます

$class = "ClassC";
$method = "methodA";
$param = array("some text");

$objX = new ClassX();
$chain = $objX->{$class};

$chainにはClassCからのオブジェクトがあります

$objX->{$class}呼び出しごと にオブジェクトの値をリセットする必要がない場合は、if(!isset($this->classes[object]))

于 2013-01-07T13:52:08.110 に答える
0

これらのオブジェクトを動的に構築する必要があるようです。Reflection拡張機能を試してください。サンプルは次のとおりです。

$dateTimeRefl = new ReflectionClass('DateTime');
$dynamicallyBuildDateTime = $dateTimeRefl->newInstance('2013-01-01');

newInstance()とnewInstanceArgs()の2つのメソッドがあり、call_user_func()とcall_user_func_array()と同等です。

これにはPHP5.2以降が必要です。

于 2013-01-07T13:49:28.387 に答える