3

我想实例化一个类,它需要任意数量的构造函数参数。

假设我有一个类 Man,它在构造函数中有两个参数。

class Man
{
    protected $name;
    protected $age;

    public function __construct($name, $age)
    {
        $this->name = $name;
        $this->age = $age;
    }
}

然后我有参数:

$params = array()
$params['name'] = 'Jack';
$params['age'] = 55;

这就是我实例化一个类的方式:

$jack = new Man($params['name'], $params['age']);

现在我想要实现的是 params 数组可以是任意大小,2、3、4、任何大小,并且我要实例化的类将具有相同数量的参数。

所以唯一困扰我的是如何自动创建变量?有提取功能,但它返回变量的数量:(

我需要这样的东西:

$jack = new Man($name, $age);

但这应该是自动创建的。该脚本只知道 params 数组,它需要将所有数组值作为变量推送。

最接近的事情是这样的:

$jack = new Man(extract($params));

但是提取函数返回数字,我需要从数组中创建变量,并将它们提供给类构造函数。

编辑:

我无法更改正在构建的类,我唯一​​的目标是构建该类,并在构造函数中传递它期望的变量。所以我对我建立的类没有权力,我的目标是只实例化那个类,并给她的构造函数参数。这些参数存储在 $params 数组中,但类需要它作为变量。希望它更容易掌握我想要实现的目标。

谢谢

4

6 回答 6

1

您可以执行以下两项操作之一:

  1. 传入参数数组:

    public function __construct(array $params) {}
    
  2. 在函数内部使用func_get_args()以获取关联数组形式的所有参数。

第一种方法更可取,因为它包含的“魔法”较少。

为了调用具有未知参数集的函数,当参数为数组形式时,您可以使用call_user_func_array().

于 2012-09-02T19:29:42.730 回答
1

我会将数组传递给构造函数:

$jack = new Man($params);

然后在构造函数中处理参数:

class Man
{
  public $Age;

  public function __construct( array $params )
  {
     foreach( $params as $key => $value ) {
       if( property_exists( $this, $key ) {
         $this->$key = $value;
       }
     }
  }
}
于 2012-09-02T19:35:35.000 回答
1

是的,extract 将返回变量的数量,但也会创建变量。您必须编写类,以便将数组作为输入,然后从类中调用 extract。这将使用设置为数组每个元素的标签的名称创建变量。

- 编辑 -

在看到问题的变化后,我修改了一个更准确的答案。

- 例子 -

$params = array();  
$params['name'] = 'Jack';  
$params['age'] = 55;  

$jack = createMan($params);

//Function designed to extract correct parameters from $params

function createMan($params){

    extract($params);

    if(isset($name) && isset($age)){
        return new man($name, $age);
    }else{
        //What ever error logging and return null
        return null;
    }
}
于 2012-09-02T19:35:50.277 回答
0

我需要的是这样的:

反射类::newInstanceArgs

So the solution to my problem is this:

$reflection = new \ReflectionClass($class); 
return $reflection->newInstanceArgs($params);

Where $params is array with params, and $class is name of the class Im building.

Thanks for all the comments!

于 2012-09-02T20:35:09.303 回答
-1

遍历您的数组,并使用$obj->{$keyname}语法设置您的类的属性。

public function __construct($params) {
    foreach($params as $key => $value) {
        $this->$key = $value;
    }
}
于 2012-09-02T19:30:59.350 回答
-1

这可能会有所帮助:

class man{
   public function __construct($params){
      foreach($params as $key=>$value){
       $this->$key=$value;
      }
   }
}

这样,数组键将被分配为变量。

于 2012-09-02T19:36:41.913 回答