这可能是一些XY问题,所以我将首先解释一下我要做的事情。我正在尝试创建一个php文件来处理我的所有页面刷新AJAX调用。这意味着我希望能够向它发送一个类名,以及类构造函数所采用的变量列表,然后创建该类。
我可以创造好的课程。 $class = new $className();
可以很好地创建类。问题是传递默认变量。大多数变量都是包含其他类的对象,所以我不能只在创建类时包含它,我需要在创建类时传递它们。
我正在思考以下几点:
$varStr = '';
$s = '';
foreach($vars as $var) {
switch($var['type']) {
case 'object':
$varStr .= $s . '$' . $var['value'];
break;
case 'variable':
$varStr .= $s . $var['value'];
}
$s = ',';
}
$class = new $className(echo $varStr);
现在很明显echo $ varStr不会在那里工作,但我不知道会发生什么。有什么我可以做的,将我的数组中的变量输出到类构造函数中吗?我正在努力做甚么可能吗?还有更好的方法吗?
虽然我理解我可以将整个数组传递给类构造函数,但这会使程序的主要部分复杂化,而我宁愿放弃单个页面进行AJAX刷新的想法,而不是沿着那条路线。< / p>
答案 0 :(得分:7)
所以基本上你试图将一个可变数量的参数传递给构造函数?在常规功能中,您可以执行以下操作:
function foo() {
$args = func_get_args();
...
}
call_user_func_array('foo', array('bar', 'baz'));
这对构造函数不起作用,因为调用机制是不同的。你可以这样做:
class Foo {
public function __construct() {
$args = func_get_args();
...
}
}
$class = new ReflectionClass('Foo');
$obj = $class->newInstanceArgs(array('bar', 'baz'));
但实际上,你应该做的是:
class Foo {
public function __construct(array $args) {
...
}
}
$obj = new Foo(array('bar', 'baz'));
或
class Foo {
public function __construct($bar, $baz) {
...
}
}
$obj = new Foo('bar', 'baz');
其他任何事都很疯狂。如果你的对象构造函数如此复杂,你可能需要简化它。
答案 1 :(得分:1)
这是对你想要做的事情的猜测,但也许这就是你所追求的:
// Generate constructor args
$args = array();
foreach($vars as $var) {
switch($var['type']) {
$value = $var['value'];
case 'object':
args[] = ${$value}; // evaluate, I think that's what you want?
break;
case 'variable':
args[] = $value; // use as is
break;
}
}
// Instanciate class with args
$class = new ReflectionClass($className);
$obj = $class->newInstanceArgs($args);
要使其工作,需要$ vars以每个类构造函数所需的正确顺序枚举args。