bind と singleton の違いは何ですか。singleton にして困る場面はありますか。
bind は解決のたびに新しいインスタンスを作り、singleton は最初の1個を使い回します。困るのは singleton が内部に状態を持つ場合で、常駐型の実行環境では影響が残ります。
面接官が見ているのは使い分けの判断ができるか。
これは「Laravel のサービスコンテナが提供している主な価値はどれですか。」への追撃質問です。
よくある答えと、面談でどう見られるか
- bind は都度生成、singleton は使い回し。状態を持つものを singleton にすると常駐プロセスで漏れる
その通りです。Web リクエストでは表面化しにくく、queue:work のような常駐プロセスで前のジョブの状態が次に漏れます。 - singleton の方が速いので常に singleton を使うべき
状態を持つクラスでは事故になります。速度だけで選ぶものではありません。 - bind と singleton に機能差はなく、書き方の好み
生成回数が違います。挙動が変わります。 - singleton はリクエストをまたいでインスタンスが共有される
通常の Web リクエストではプロセスが終わるので共有されません。共有されるのは常駐プロセスの中だけ、という区別が重要です。
面接官は何を見ているか
- bind は都度生成、singleton は使い回しと説明できた
- singleton が状態を持つと問題になると指摘できた
- キューワーカーのような長時間プロセスでの注意点に触れた
模範解答
bind は解決するたびに新しいインスタンスを作り、singleton は最初の1個を使い回します。困るのは singleton が内部に状態を持つ場合です。通常のWebリクエストはリクエストごとにプロセスが終わるので問題が出にくいのですが、queue:work のような常駐プロセスでは前のジョブの状態が次に漏れます。状態を持つものは singleton にしない、が基本です。