如何从数组中自动生成变量


How to automaticly build variables from array?

我想实例化一个类,它接受任意数量的consturator参数。

假设我有一个类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、任意,并且我要实例化的类将具有相同数量的params。

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

我需要这样的东西:

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

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

最接近的是:

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

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

编辑:

我不能更改我正在构建的类,我唯一的目标是构造那个类,并在构造函数中传递它所期望的变量。所以我对我创建的类没有权力,我的目标是只创建那个类,并给她consturator参数。这些params存储在$params数组中,但类需要将其作为变量。希望更容易理解我想要实现的目标。

感谢

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

  1. 传入一组参数:

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

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

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

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

$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;
       }
     }
  }
}

是的,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;
    }
}

我需要的是:

反射类::newInstanceArgs

因此,我的问题的解决方案是:

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

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

感谢所有的评论!

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

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

这可能会有所帮助:

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

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