gpt4 book ai didi

php - 是否有一个 call_user_func() 相当于创建一个新的类实例?

转载 作者:IT王子 更新时间:2023-10-28 23:52:33 26 4
gpt4 key购买 nike

如何创建一个具有给定参数数组的类,并将其发送给构造函数?类似的东西:

class a {
var $args = false;
function a() {$this->args = func_get_args();}
}

$a = call_user_func_array('new a',array(1,2,3));
print_r($a->args);

理想情况下,这需要在不修改类的情况下在 PHP4 和 PHP5 中工作。有什么想法吗?

最佳答案

ReflectionClass:newInstance() (或 newInstanceArgs())让你这样做。

例如

class Foo {
public function __construct() {
$p = func_get_args();
echo 'Foo::__construct(', join(',', $p), ') invoked';
}
}

$rc = new ReflectionClass('Foo');
$foo = $rc->newInstanceArgs( array(1,2,3,4,5) );

编辑:没有 ReflectionClass 并且可能与 php4 兼容(抱歉,目前没有 php4)

class Foo {
public function __construct() {
$p = func_get_args();
echo 'Foo::__construct(', join(',', $p), ') invoked';
}
}

$class = 'Foo';
$rc = new $class(1,2,3,4);

速度比较:既然提到了反射速度,这里就做一个小(综合)测试

define('ITERATIONS', 100000);

class Foo {
protected $something;
public function __construct() {
$p = func_get_args();
$this->something = 'Foo::__construct('.join(',', $p).')';
}
}

$rcStatic=new ReflectionClass('Foo');
$fns = array(
'direct new'=>function() { $obj = new Foo(1,2,3,4); },
'indirect new'=>function() { $class='Foo'; $obj = new $class(1,2,3,4); },
'reflection'=>function() { $rc=new ReflectionClass('Foo'); $obj = $rc->newInstanceArgs( array(1,2,3,4) ); },
'reflection cached'=>function() use ($rcStatic) { $obj = $rcStatic->newInstanceArgs( array(1,2,3,4) ); },
);


sleep(1);
foreach($fns as $name=>$f) {
$start = microtime(true);
for($i=0; $i<ITERATIONS; $i++) {
$f();
}
$end = microtime(true);
echo $name, ': ', $end-$start, "\n";
sleep(1);
}

在我的(没那么快的)笔记本上打印

direct new: 0.71329689025879
indirect new: 0.75944685935974
reflection: 1.3510940074921
reflection cached: 1.0181720256805

这不是很糟糕,是吗?

关于php - 是否有一个 call_user_func() 相当于创建一个新的类实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1929108/

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