如何从数组中自动构建变量?

时间:2012-09-02 19:27:44

标签: php

我想实现一个类,它需要任意数量的consturctor参数。

假设我有一个类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));

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

编辑:

我无法改变我构建的类,我唯一​​的目标是构造该类,并在构造函数中传递它所期望的变量。因此,我对建立这个班级没有任何权力,我的目标是只对那个班级进行实例化,然后给她的consturctor params。那些参数存储在$ params数组中,但是类需要它作为变量。希望更容易理解我想要实现的目标。

由于

6 个答案:

答案 0 :(得分:1)

你可以做以下两件事之一:

  1. 传入一系列参数:

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

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

    为了使用一组未知的参数调用函数,当参数采用数组的形式时,您可以使用call_user_func_array()

答案 1 :(得分:1)

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

$jack = new Man($params);

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

class Man
{
  public $Age;

  public function __construct( array $params )
  {
     foreach( $params as $key => $value ) {
       if( property_exists( $this, $key ) {
         $this->$key = $value;
       }
     }
  }
}

答案 2 :(得分: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;
    }
}

答案 3 :(得分:0)

我需要的是:

ReflectionClass::newInstanceArgs

所以问题的解决方案就是:

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

其中$ params是带有params的数组,$ class是Im类的名称。

感谢所有评论!

答案 4 :(得分:-1)

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

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

答案 5 :(得分:-1)

这可能会有所帮助:

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

这样,数组键将被指定为变量。