0

私は 2 つの引数を必要とするクラスを構築しています。これらは を介し​​て渡すことも__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% ではありません。私を悩ませているのは、引数がコンストラクターを介して渡される場合、1 つだけでなく両方が必要なことです。

ユーザーがコンストラクターに引数を1つだけ入れないようにするにはどうすればよいですか?

4

5 に答える 5

5

現在、2 つの引数を渡す必要があります。オプションにするには、デフォルト値を割り当てる必要があります。次に、簡単なチェックで両方を強制できます。

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)で型を定義したら、ユーザーが2つの配列を渡さなければならないことを確認します。

$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

私は次のようにします:

public function __construct(array $configs = false, array $services = false)
    {
        if($configs && $services) {
            $this->configs = $configs;
            $this->services = $services;
        }
    }
于 2012-10-18T12:47:40.673 に答える
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

phpis_null()関数を追加できるので、!is_null(arg1) && !is_null(arg2)の場合は問題ありません。

于 2012-10-18T12:44:29.480 に答える