Menu
Coddy logo textTech

マジックメソッド入門

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について詳しく見ていきます。

challenge icon

チャレンジ

簡単

magic method を紹介する映画カタログシステムを構築しましょう。Movie class を作成し、__construct() を使用して映画データを初期化し、__toString() を使用して object が出力されたときに整った string 表現を提供します。

コードを2つのファイルに整理します。

  • Movie.php:カタログ内の映画を表す Movie class を 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 して Movie instance を 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()メソッドが自動的に呼び出されます)

?>
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: PHPオンラインコンパイラ