1

这可能是一个 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 刷新的想法,也不愿走这条路。

4

2 回答 2

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');

其他任何事情都是非常疯狂的。如果您的对象构造函数如此复杂,您可能需要对其进行简化。

于 2013-08-28T12:38:48.263 回答
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。

于 2013-08-28T13:06:45.533 回答