如何在php中动态创建对象

时间:2013-01-07 13:40:13

标签: php class object dynamic

我有一个Class X,我从那里访问我的应用程序的其余类。此访问是动态完成的。下面的示例代码(demo here):

<?
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不在桌面上

我可以做我想要实现的目标吗?

Spyric钉了它!我只需要在__get()

中返回一个
function __get($object)
{
    $this->$object = new $object();
    return $this->$object;
}

最终代码here

2 个答案:

答案 0 :(得分:2)

过去我需要类似于存储数据的东西。代码看起来很简单:

class ClassX
{
    var classes = array();

    function __construct()
    {
    }
}

getter:

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]))

答案 1 :(得分:0)

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

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

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

你需要PHP 5.2或更高版本。