マジックメソッド入門
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 44/91。
Magic methodは、二重アンダースコア(__)で始まり、特定のイベントやアクションに応じてPHPによって automatically called される特別な method です。すでにそのうちの2つ、__construct()と__destruct()を使用しました。
これらのメソッドを使うと、PHP の内部動作にフックし、一般的な操作に対するオブジェクトの応答方法をカスタマイズできます。
たとえば、objectをprintしようとすると何が起こるでしょうか? あるいは、存在しないpropertyにアクセスするとどうなるでしょうか? magic methodを使うと、こうした状況を制御できます。
ここでは、最もよく使用されるマジックメソッドを簡単に概説します。
| Method | トリガーされるタイミング |
|---|---|
__construct() | Object が作成されたとき |
__destruct() | Object が破棄されたとき |
__toString() | Object が string として使用されたとき |
__get() | 未定義の property にアクセスしたとき |
__set() | 未定義の property を設定したとき |
__call() | 未定義の method を呼び出したとき |
__clone() | Object が複製されたとき |
<?php
class Book {
public function __construct(
private string $title
) {}
public function __toString(): string {
return "Book: " . $this->title;
}
}
$book = new Book("PHP Mastery");
echo $book;
出力:
Book: PHP Mastery__toString()がなければ、オブジェクトをechoしようとするとエラーが発生します。このmagic methodがこの操作を受け止め、代わりにオブジェクトのstring表現をReturnします。これからのレッスンでは、それぞれのmagic methodについて詳しく見ていきます。
チャレンジ
簡単magic method を紹介する映画カタログシステムを構築しましょう。Movie class を作成し、__construct() を使用して映画データを初期化し、__toString() を使用して object が出力されたときに整った string 表現を提供します。
コードを2つのファイルに整理します。
Movie.php:カタログ内の映画を表すMovieclass を Create します。constructor promotion を使用して、$title(string)、$director(string)、$year(integer)の private properties を define します。__toString()magic method を Implement し、formatted string"[title] ([year]) - Directed by [director]"を Return します。これにより、別の method を呼び出さなくても、movie object を直接 Echo できるようになります。main.php:Movie ファイルを Include します。3つの入力、つまり movie title、director 名、release year を受け取ります。これらの values を using してMovieinstance を Create します(year は integer に変換します)。その後、movie object を直接 Echo します。出力を生成するために、__toString()method が automatically called されます。
__toString() の magic は、object が string context で使用されるたびに、PHP が automatically それを呼び出すことです。echo $movie->getInfo(); と記述する代わりに、単に echo $movie; と記述でき、PHP が変換を処理してくれます。これにより、object をより直感的に扱えるようになります。
自分で試してみよう
<?php
require_once 'Movie.php';
// 入力を読み取る
$title = trim(fgets(STDIN));
$director = trim(fgets(STDIN));
$year = intval(fgets(STDIN));
// TODO: 入力値を使ってMovieインスタンスを作成する
// TODO: Movieオブジェクトを直接echoする(__toString()メソッドが自動的に呼び出されます)
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ