使用arguments数组创建新的对象实例

时间:2013-06-25 12:37:12

标签: php class instance

我正在尝试创建一个类的新实例:

$obj = new $class;

我这样做的方式是,一组通用函数会为许多类执行此操作,但现在我正在实现一些参数。现在虽然处理函数看起来像这样:

function newInst($argA = null, $argB = null, $argC = null)

这必须预先包含所有参数并且具有上限。所以,我正在尝试这样做:

function newInst() {
    $obj = new $class(func_get_args());
    ...
}

但不是只应用第一个参数,我希望它将数组应用为一组参数。我试过了

function newInst() {
    $obj = new $class;
    call_user_func_array(array($obj, '__construct'), func_get_args());
    ...
}

但是它会调用__construct函数两次。那么,有没有办法使用被调用函数的参数来创建一个在实例化过程中通过__constructclassname函数的新实例?

1 个答案:

答案 0 :(得分:5)

如果您不反对使用反射:ReflectionClass::newInstanceArgs

function createInstance($class, array $arguments) {
    $reflection = new ReflectionClass($class);
    return $reflection->newInstanceArgs($arguments);
}

反思提供了很多,尽管人们普遍认为它是“”,但它的反映将是你应用程序中真正的瓶颈;无论如何,任何可能的缓存都可以缓解。


根据讨论,我只是修改了count()检查和天真缓存的假设解决方案;它仍然(肯定)需要分析。

function createInstance($class, array $arguments) {
    static $cache = [];
    switch (count($arguments)) {
        case 0: return new $class();
        case 1: return new $class($arguments[0]);
        case 2: return new $class($arguments[0], $arguments[1]);
        case 3: return new $class($arguments[0], $arguments[1], $arguments[2]);
    }
    if (!isset($cache[$class])) {
        $cache[$class] = new ReflectionClass($class);
    }
    return $cache[$class]->newInstanceArgs($arguments);
}