PHP 5.6 以降では可変長引数がサポートされています。
http://php.net/manual/ja/functions.arguments.php#functions.variable-arg-list
<?php function sum(...$numbers) { $acc = 0; foreach ($numbers as $n) { $acc += $n; } return $acc; } echo sum(1, 2, 3, 4); ?>
▽2
●
syamaoka ●50ポイント ベストアンサー |
メソッドの引数の増加は、『Smalltalk Best Practice Patterns』(Kent Beck)や『Refactoring: Improving the Design of Existing Code』(Martin Fowler)といった名著でも扱われているありふれたテーマです。
これらの書籍で紹介されている、引数の増加に対する有名な2つの対処法を紹介します。
1. 引数オブジェクトの導入
個別に渡している引数をクラスに集め、そのクラスのインスタンスを渡す手法です。
<?php class Parameter { public $arg1; public $arg2; public $arg3; } hoge(Parameter $parameter);
2. メソッドに対して引数を渡している側にメソッドの処理自体を移す
多くの引数に依存するメソッドは、そのメソッドが本来あるべきクラスに定義されていないということが往々にしてあります。引数を渡すということ自体を見直し、呼び出し側に処理を移す手法です。
<?php class NewClass { private $arg1; private $arg2; private $arg3; public function hoge() { // $arg1, $arg2, $arg3 を使った処理 } }
いかがでしょうか。
ちなみに、質問文に書かれているように、クラスに継承関係を作り、派生クラスを導入する方法は、(質問文だけでは設計の詳細が完全に把握はできていませんが)「あまり良くない」設計ではなく「悪い」設計であろうことが伺われます。なぜ悪手なのかは、「リスコフの置換原則」や「型の継承 実装の継承 違い」などのキーワードで検索して調べてみてください。