gpt4 book ai didi

php - 使用参数数组创建新的对象实例

转载 作者:可可西里 更新时间:2023-10-31 22:55:51 25 4
gpt4 key购买 nike

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

$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 函数?

最佳答案

如果您不反对使用反射: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);
}

关于php - 使用参数数组创建新的对象实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17297549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com