Laravelの仕組みについて勉強していたところ、「__construct」というものが出てきたので、copilotに聞いたことをメモしておきます。
Bladeテンプレートで次のようなコードによりセッションのmessageがMessageクラスのインスタンスに引数として渡されます。
//例 セッションのメッセージを取得してMessageクラスの引数として渡す
<x-message :message="session('message')" />
このとき、セッションのmessageが、Messageクラスの中の「__construct」の引数として渡されることにより処理がうまく流れていくのですが、なぜ単にMessageクラスの引数であるだけのmessageが、ちゃんとその中でも「__construct」の引数として扱われるのか、言い換えると、Messageクラスの中に「__construct」以外のfunctionが存在していても、その引数はほかのfunctionではなく「__construct」に渡すものであるとどういう風に判定しているのだろうか。この点が疑問でした。
//Messageクラス(message.php)のコード
<?php
namespace App\View\Components;
use Illuminate\View\Component;
class Message extends Component
{
public $message;
// コンストラクタ。オブジェクトが作られるときにメッセージをセットする
public function __construct($message)
{
$this->message = $message;
}
// ビュー(HTMLテンプレート)を返すメソッド
public function render()
{
return view('components.message');
}
}
調べたところ、「__construct」というのはPHPに用意されている特別なメソッドであり、クラスのインスタンスが生成されるときに最初に実行される性質を持つようです。そのため、クラスの中に「__construct」が存在すれば、クラスに対して渡された引数は、インスタンス化時に必ず「__construct」の引数として処理されるとのことです。
ちなみにこういった「__」で始まるものはほかにもあって、PHP標準の機能として用意されているマジックメソッドというそうです。
代表的なマジックメソッド
__construct()
: オブジェクトが生成されるときに呼び出されるコンストラクタ。__destruct()
: オブジェクトが破棄されるときに呼び出されるデストラクタ。__get($name)
: 存在しないプロパティにアクセスするときに呼び出される。__set($name, $value)
: 存在しないプロパティに値を設定するときに呼び出される。__call($name, $arguments)
: 存在しないメソッドを呼び出すときに呼び出される。__toString()
: オブジェクトが文字列として扱われるときに呼び出される。__invoke()
: オブジェクトが関数のように呼び出されるときに呼び出される。
これまで素のPHPの基本を学び、Dockerの環境構築もようやく完了し、ついに本格的に勉強を進められるようになったけど、勉強すればするほど新しい疑問が出てきて、習得までには結構時間がかかりそうです。
コメント