我想实例化一个类,它接受任意数量的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数组中,但类需要将其作为变量。希望更容易理解我想要实现的目标。
感谢
您可以做以下两件事之一:
-
传入一组参数:
public function __construct(array $params) {}
-
在函数内部使用
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;
}
}
}
这样,数组键将被指定为变量。