こんにちは、Nakaです。
今回は Laravel の動的な挙動を理解したい方向けに、Eloquent モデルや Facade、Macro がどのように動作しているのか、実際のソースコードを追いながら解説していきます。
Laravel を触っていると、誰しも一度はこんなことを感じたことがあるのではないでしょうか。
$user->name が普通のプロパティのように動くUser::where('email', $email) が static に見えるのに、Model クラスに where メソッドが定義されていない「便利だけど、正直よく分からない…」と感じたことがある方も多いはずです。PHP を素直に書いてきた人ほど、この“よく分からなさ”に引っかかります。実は、Laravel ではこうした魔法のように見える挙動の裏側で PHP のマジックメソッド が活躍しています。
例えば Eloquent モデルを使うと、
$user = User::first();
echo $user->name;
name というプロパティは User クラス内で定義されていませんが、値を取得することができます。さらに、
User::where('email', '[email protected]')->first();
where というメソッドはEloquentモデルには定義されていませんが、呼び出すことができます。こうした挙動が積み重なることで、Laravel のコードはまるで魔法のように見えてきます。
PHP には、特定の条件で自動的に呼び出される特殊なメソッド が用意されています。 __construct もマジックメソッドの一つで、普段から使っている方も多いでしょう。Laravel では、存在しないプロパティやメソッドを呼んだときに挙動を制御するために、次の 4 つのマジックメソッドがよく使われます。
__get:存在しないプロパティにアクセスされたときに呼ばれる__set:存在しないプロパティに値をセットしたときに呼ばれる__call:存在しないインスタンスメソッドが呼ばれたときに呼ばれる__callStatic:存在しない static メソッドが呼ばれたときに呼ばれるLaravel では、この 4 つを使うことで 個別にプロパティやメソッドを定義せずに機能を実現 しています。