Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将一组变量传递给类_Php_Class_Oop - Fatal编程技术网

Php 如何将一组变量传递给类

Php 如何将一组变量传递给类,php,class,oop,Php,Class,Oop,这可能有点像XY问题,所以我先解释一下我想做什么。我试图创建一个php文件来处理所有页面刷新AJAX调用。这意味着我希望能够向它发送一个类名,加上类构造函数接受的变量列表,然后让它创建类 我可以很好地创建这个类$class=新的$className;对于创建类来说效果很好。问题是传入默认变量。大多数变量都是包含其他类的对象,所以我不能在创建类后就包含这些变量,我需要在创建类时传递它们 我的想法大致如下: $varStr = ''; $s = ''; foreach($vars as $var)

这可能有点像XY问题,所以我先解释一下我想做什么。我试图创建一个php文件来处理所有页面刷新AJAX调用。这意味着我希望能够向它发送一个类名,加上类构造函数接受的变量列表,然后让它创建类

我可以很好地创建这个类$class=新的$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刷新的单个页面的想法,也不愿走这条路。

那么基本上你是在尝试将数量可变的参数传递给构造函数?在常规函数中,您可以执行以下操作:

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


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

那么基本上您是在尝试向构造函数传递数量可变的参数?在常规函数中,您可以执行以下操作:

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


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

这是对您试图做什么的猜测,但可能这就是您想要的:

// 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以每个类构造函数所期望的正确顺序枚举arg。

这是对您试图执行的操作的粗略猜测,但可能这就是您想要的:

// 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以每个类构造函数期望的正确顺序枚举参数。

您可能想了解是否需要将对象传递给构造函数,或者是否可以传递方法调用或数据成员的结果?我问这个问题是因为让类依赖于其他类的工作将它们紧密地结合在一起,并可能导致一些额外的维护。为什么将数组传递给构造函数会使事情变得复杂?比你现在更重要doing@SurrealDreams我将主要将对象传递给构造函数。@Ben这将需要大量重写,我根本没有时间重写。您可能想了解是否需要将对象传递给构造函数,或者是否可以传递方法调用或数据成员的结果?我问这个问题是因为让类依赖于其他类的工作将它们紧密地结合在一起,并可能导致一些额外的维护。为什么将数组传递给构造函数会使事情变得复杂?比你现在更重要doing@SurrealDreams我将主要将对象传递给构造函数。@Ben这将需要大量重写,我根本没有时间重写。类构造函数没有那么复杂,它只获取类函数需要的对象和外部变量,并存储它们以供使用,然后生成HTML,以便根据命令输出。ReflectionClass似乎确实是一种方式,但我并不真正理解它。你能扩大你的答案吗?你还想知道什么?阅读手册?我认为@Styphon试图做的是以某种方式生成文本php代码,他通常会使用这些代码来实例化给定的类,并同时运行这些代码…@deceze我只是在绞尽脑汁,举个例子。如本的回答,将是理想的。不过,谢谢你,我最终还是做到了。类构造函数并没有那么复杂,它只需要获取类函数所需的对象和外部变量,并将它们存储起来以供使用,然后生成HTML,供命令输出。ReflectionClass似乎确实是一种方式,但我并不真正理解它。你能扩大你的答案吗?你还想知道什么?阅读手册?我认为@Styphon试图做的是以某种方式生成文本php代码,他通常会使用这些代码来实例化给定的类,并同时运行这些代码…@deceze我只是在绞尽脑汁,举个例子。如本的回答,将是理想的。不过我最终还是到了那里,谢谢你。我自己得出了这个结论
如果我刚刚回去接受另一个答案,我看到了这个。这正是我想要的。一开始,我很难理解ReflectionClass,但哇,这是PHP可以做的一些聪明的事情。@deceze可能会因为ReflectionClass而获得荣誉。。但他有足够的代表点:PI自己得出了这个结论,当我回过头来接受另一个答案时,我看到了这一点。这正是我想要的。一开始,我很难理解ReflectionClass,但哇,这是PHP可以做的一些聪明的事情。@deceze可能会因为ReflectionClass而获得荣誉。。但他有足够的代表分数:P