アプリケーションの残りのクラスにアクセスするクラス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;
}
ここに最終的なコード