ReflectionClass:newInstance() (hoặc newInstanceArgs()) hãy để bạn làm điều đó.
ví dụ:
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));
chỉnh sửa: không ReflectionClass và có lẽ PHP4 tương thích (xin lỗi, không có php4 trong tầm tay ngay bây giờ)
class Foo {
public function __construct() {
$p = func_get_args();
echo 'Foo::__construct(', join(',', $p), ') invoked';
}
}
$class = 'Foo';
$rc = new $class(1,2,3,4);
tốc độ so sánh: Kể từ khi tốc độ phản xạ đã được đề cập ở đây là một chút (tổng hợp) kiểm tra
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);
}
mà in trên (không quá nhanh) của tôi máy tính xách tay
direct new: 0.71329689025879
indirect new: 0.75944685935974
reflection: 1.3510940074921
reflection cached: 1.0181720256805
Điều đó có tệ không?
Tại sao bạn muốn thực hiện như thế này? Bạn đang cố giải quyết vấn đề gì? – Skilldrick
@ Skilldrick: trong trường hợp của tôi, cố gắng triển khai một thùng chứa phụ thuộc đơn giản. –
Có thể trùng lặp của [Cách gọi hàm tạo với lệnh \ _user \ _func \ _array trong PHP] (http://stackoverflow.com/questions/2409237/how-to-call-the-constructor-with-call-user- func-array-in-php) – Maks3w