PHP构造函数参数?

时间:2012-10-18 12:41:29

标签: php

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

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

5 个答案:

答案 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;
        }
    }