0

我正在构建一个需要两个参数的类,它们可以通过 传递__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%。困扰我的是,如果参数是通过构造函数传递的,我希望它们都在那里,而不仅仅是一个。

如何防止用户在构造函数中只放置一个参数?

4

5 回答 5

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,因为该变量始终存在,因为它是函数签名的一部分。您只需要检查这些值。

于 2012-10-18T12:47:26.373 回答
1

你测试过吗?当您在函数头中定义类型时 __construct(array $configs, array $services),您确保用户必须传递两个数组!

$test = new Services(array());

失败 - 可捕获的致命错误:传递给 Services::__construct() 的参数 2 必须是数组

$test = new Services('','');

失败 - 可捕获的致命错误:传递给 Services::__construct() 的参数 1 必须是一个数组,

只要

$test = new Services(array(), array());

被允许!

于 2012-10-18T12:54:58.877 回答
0

你可以添加phpis_null()函数,所以如果!is_null(arg1) && !is_null(arg2),那么你很好。

于 2012-10-18T12:44:29.480 回答
0

单独处理您传递的参数。

public function __construct(array $configs, array $services)
{
    if(isset($configs)) {
        $this->configs = $configs;
    }
    if(isset($services)) {
        $this->services = $services;
    }
}
于 2012-10-18T12:44:57.047 回答
0

我会这样做:

public function __construct(array $configs = false, array $services = false)
    {
        if($configs && $services) {
            $this->configs = $configs;
            $this->services = $services;
        }
    }
于 2012-10-18T12:47:40.673 回答