我想实现一个类,它需要任意数量的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数组中,但是类需要它作为变量。希望更容易理解我想要实现的目标。
由于
答案 0 :(得分:1)
你可以做以下两件事之一:
传入一系列参数:
public function __construct(array $params) {}
在函数内部使用func_get_args()
以关联数组的形式获取所有参数。
第一种方法更可取,因为它含有较少的“魔力”。
为了使用一组未知的参数调用函数,当参数采用数组的形式时,您可以使用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;
}
}
}
这样,数组键将被指定为变量。