質問: 'fuga'; // デフォルト値 } ``` 親クラスでnewを使うのも微妙ですし、 わざわざ子クラスから渡すのも微妙ですし。。 もっと良い書き方があれば知りたいです。 そもそもコンストラクタインジェクションの使い方がおかしいのでしょうか? ご教示頂けると有難いです。
回答: > > コンストラクタインジェクションの使い方 > > > どう使うのが正しいとか、難しいですよね・・・ そこそこlaravelを使っていますが、色々な部分でいまだに「これでいいのかな?もっといい方法があるのでは?」と思うコトが多々あります。 というわけで、「大正解」というものはちょっとわからないので、以下は個人的な見解としてお聞きください。。。 質問のようなことを実際によくしています。 なので可能かどうかについては、「可能」と回答できます。 ただ、DIは「単体テスト」に大きくメリットのあるテクニックですよね。 親クラスの中で単純にnewしてインスタンスを作った場合、親クラスの単体テストが出来なくなるというデメリットになりますので、newする場合は下記のようにすると良いのではないかと思います。 親クラス ``` protected $hoge; public function __construct(Hoge $hoge = null) { $this->hoge = $hoge ? $hoge : new Hoge(); $this->hoge->fuga = 'fuga'; // デフォルト値 } ``` 実際に私が実装してきたものの場合、 元々「親」にする予定のなかったクラスを、後の機能追加などで似た機能があるため「親」として継承させる、というようなケースが多かったので、親側の修正をしなくて済むよう「子クラスから渡す」方法をとることがほとんどでした。 なので実装のタイミング次第で、 ・親クラスでnew ・子クラスから渡す のどちらにするかは、やりやすい方を選択すればいいのではないかな~ と思っています。