我正在尝试创建一个类的新实例:
$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函数两次.那么,有没有办法使用被调用函数的参数来创建一个在实例化过程中通过__construct或classname函数的新实例?
解决方法:
如果您不反对使用反射: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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。