人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPでクラスのメソッドに複数(5つ以上)のパラメータを渡す必要がでてきたのですが、例えば、下記のようにメソッドに引数として記述すると冗長になってしまいます。

public function hoge($arg1, $arg2, $arg3, $arg4...)

元のクラスを継承してパラメータをプロパティに記述という手も考えたのですが、

protected $arg1 = 1;
protected $arg2 = 2;
protected $arg3 = 3;
protected $arg4 = 4;
:
public function hoge()

あまりよい方法ではないと思い悩んでいます。

他によい方法がありましたら教えてください。
(できればメリット/デメリットも併せて頂くと助かります)

※パラメータを配列にまとめて引数として渡す方法は、できれば個人的にやりたくないので、それ以外でお願いします


●質問者: wankodon
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● gizmo5
●50ポイント

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);
?>

wankodonさんのコメント
回答有り難うございます。 可変長だとメソッド内で引数のチェックを行う処理が面倒なので、それはちょっと使えません。。

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 を使った処理
 }
}

いかがでしょうか。

ちなみに、質問文に書かれているように、クラスに継承関係を作り、派生クラスを導入する方法は、(質問文だけでは設計の詳細が完全に把握はできていませんが)「あまり良くない」設計ではなく「悪い」設計であろうことが伺われます。なぜ悪手なのかは、「リスコフの置換原則」や「型の継承 実装の継承 違い」などのキーワードで検索して調べてみてください。


wankodonさんのコメント
遅くなりましたが、大変参考になりました。なるほど。色々あるのですね。 頂いたキーワードを元にあとで調べてみます。 回答どうも有り難うございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ