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}remove if(!isset($this->classes[object]))

于 2013-01-07T13:52:08.110 回答
0

似乎您需要动态构建这些对象。尝试反射扩展,这是一个示例:

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

有两种方法:newInstance() 和 newInstanceArgs(),它们等效于 call_user_func() 和 call_user_func_array()。

为此,您需要 PHP 5.2 或更新版本。

于 2013-01-07T13:49:28.387 回答