Laravelのコードで、「$this->app->メソッド」と「app()->メソッド」はどちらで記述しても同じ処理になる。
なぜ、同じ処理なのに異なる書き方があるのか?と気になった人もいるはず。ここではそれぞれの違いについて解説しています。
「$this->app->メソッド」と「app()->メソッド」の違い
「$this->app->メソッド」と「app()->メソッド」の違いは、Laravelに登録されたヘルパか、インスタンス内のメソッドとして呼び出しているかの違い。
記述 | 内容 |
---|---|
app() | ヘルパ |
$this->app | インスタンス内のメソッド |
appヘルパ
Laravelはよく使う処理をヘルパとしてグローバルな関数をデフォルトで登録している。Laravelの処理を助けてくれる関数なので、ヘルパ(関数)と呼ぶ。
使い方は「ヘルパ名()」。例えば、リダイレクトを設定できる redirect()、ビューファイルを呼び出す view() もヘルパ。
(参考)Laravel公式 ヘルパ一覧
appヘルパは、サービスコンテナのインスタンスを返す。
サービスコンテナはIlluminate\Foundation\Applicationクラスで定義されている。このため、app()を実行すれば、Illuminate\Foundation\Applicationクラスのインスタンスを生成したことになる。
$this->app
$this->app は、処理を記述しているクラス自身のオブジェクトの中のappメソッドを呼び出す処理になる。
$thisはクラスの中で使い、ここで呼び出すメソッドをインスタンスメソッドという。
インスタンスメソッドは、クラス内であればスコープ外(関数の外)であっても、そのメソッドを呼び出すことができる。
つまり、$this->appを使う場合は、そのファイル内でIlluminate\Foundation\Applicationのインスタンスが使える場合に限る。
(use Illuminate\Foundation\Application をしているか、Illuminate\Foundation\Applicationのクラスを拡張(extend)している場合)
まとめ
記事を読んでいると、「$this->app->メソッド」と「app()->メソッド」どちらを使ってもいいという記述があるが、それぞれの処理は異なる。
「$this->app->メソッド」を使って、あれ、動かない、、、ということがないようにに、違いを理解していることは大切。