我正在构建一个需要两个参数的类,它们可以通过__constructor
传递,或者可以使用setter方法设置它们。
检查参数是否通过构造函数传递的最佳方法是什么?
我是这样做的:
class Services {
public function __construct(array $configs, array $services)
{
if(isset($configs) AND isset($services)) {
$this->configs = $configs;
$this->services = $services;
}
}
public function setConfigs(array $configs)
{
$this->config = $configs;
}
public function setServices(array $services)
{
$this->services = $services;
}
}
现在这种方法很好,但如果这是正确的方法,我不是100%。 困扰我的是,如果参数是通过构造函数传递的,我希望它们都存在,而不仅仅是一个。
如何阻止用户在构造函数中只放置一个参数?
答案 0 :(得分:5)
目前你有传递两个参数。要使它们可选,您需要指定默认值。然后,您可以通过简单的检查强制执行这两项操作:
public function __construct(array $configs = null, array $services = null) {
if ($configs === null xor $services === null) {
throw new InvalidArgumentException('Supply both or none!');
}
if ($configs && $services) {
$this->setConfigs($configs);
$this->setServices($services);
}
}
您不应该使用isset
,因为变量始终存在,因为它是函数签名的一部分。您只需要检查值。
答案 1 :(得分:1)
你测试过吗?在函数头__construct(array $configs, array $services)
中定义类型后,确保用户必须传递两个数组!
$test = new Services(array());
失败 - 可捕获的致命错误:传递给Services :: __ construct()的参数2必须是数组
$test = new Services('','');
失败 - 可捕获的致命错误:传递给Services :: __ construct()的参数1必须是数组,
仅
$test = new Services(array(), array());
是允许的!
答案 2 :(得分:0)
你可以添加php is_null()
函数,所以如果!is_null(arg1) && !is_null(arg2)
,那你没事。
答案 3 :(得分:0)
单独处理你传递的参数。
public function __construct(array $configs, array $services)
{
if(isset($configs)) {
$this->configs = $configs;
}
if(isset($services)) {
$this->services = $services;
}
}
答案 4 :(得分:0)
我会这样做:
public function __construct(array $configs = false, array $services = false)
{
if($configs && $services) {
$this->configs = $configs;
$this->services = $services;
}
}