0Pricing
PHP Academy · レッスン

マジックメソッドの概要

__toString、__get、__setなど、PHPのマジックメソッドを学びます

「マジックメソッドの概要」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。

はじめに:PHPのマジックメソッド

マジックメソッドは、2つのアンダースコアで始まる特殊なPHPメソッドです。特定の状況でPHPエンジンによって自動的に呼び出され、オブジェクトの動作に介入するためのフックを提供します。

基本概念

PHPのマジックメソッドの重要な概念:

  • __toString() — オブジェクトから文字列への変換
  • __get/__set/__isset/__unset — プロパティアクセスのインターセプト
  • __call/__callStatic — メソッド呼び出しのインターセプト
  • __invoke() — 呼び出し可能なオブジェクト

__toString

例:

<?php
class Money {
    public function __construct(
        private float  $amount,
        private string $currency
    ) {}

    public function __toString(): string {
        return number_format($this->amount, 2) . ' ' . $this->currency;
    }
}

$price = new Money(9.99, 'USD');
echo $price;            // 9.99 USD
echo 'Price: ' . $price; // Price: 9.99 USD

__getと__set

続き:

<?php
class DynamicObject {
    private array $data = [];

    public function __get(string $name): mixed {
        return $this->data[$name] ?? null;
    }

    public function __set(string $name, mixed $value): void {
        $this->data[$name] = $value;
    }
}

$obj = new DynamicObject();
$obj->name = 'Alice';
echo $obj->name;  // Alice

__issetと__unset

練習:

<?php
class Model {
    private array $attributes = [];

    public function __set(string $k, mixed $v): void { $this->attributes[$k] = $v; }
    public function __get(string $k): mixed { return $this->attributes[$k] ?? null; }
    public function __isset(string $k): bool { return isset($this->attributes[$k]); }
    public function __unset(string $k): void { unset($this->attributes[$k]); }
}

$m = new Model();
$m->email = 'a@b.com';
var_dump(isset($m->email));  // true
unset($m->email);
var_dump(isset($m->email));  // false

__callと__callStatic

さらに詳しく:

<?php
class FluentQuery {
    private array $clauses = [];

    public function __call(string $name, array $args): static {
        $this->clauses[$name] = $args[0] ?? null;
        return $this;
    }

    public function toSql(): string {
        return 'SELECT * FROM '
            . ($this->clauses['from'] ?? 'unknown');
    }
}

echo (new FluentQuery())->from('users')->toSql();
// SELECT * FROM users

__invoke

応用:

<?php
class Multiplier {
    public function __construct(private float $factor) {}

    public function __invoke(float $value): float {
        return $value * $this->factor;
    }
}

$double = new Multiplier(2);
echo $double(5);   // 10
echo $double(21);  // 42

$funcs = [new Multiplier(2), new Multiplier(3)];
foreach ($funcs as $fn) echo $fn(4) . ' '; // 8 12

__clone

実践的なパターン:

<?php
class Config {
    private array $data = [];

    public function set(string $k, mixed $v): self {
        $this->data[$k] = $v;
        return $this;
    }

    public function __clone() {
        // deep clone nested objects if needed
    }
}

$original = (new Config())->set('theme', 'dark');
$copy = clone $original;  // triggers __clone

__debugInfo

ベストプラクティス:

<?php
class ApiClient {
    public function __construct(
        private string $baseUrl,
        private string $apiKey  // sensitive!
    ) {}

    public function __debugInfo(): array {
        return [
            'baseUrl' => $this->baseUrl,
            'apiKey'  => '***' . substr($this->apiKey, -4),  // mask key
        ];
    }
}

var_dump(new ApiClient('https://api.example.com', 'secret123'));
// Shows masked key

実践的なパターン

PHPのマジックメソッドを使った実践的なパターンに、ここまでの内容をまとめて適用します。

よくある落とし穴

PHPのマジックメソッドでは、次のようなよくある間違いを避けてください:

  • オブジェクトを意味のある形で出力できるように、__toString()を使用します
  • __get/__setによってプロキシやデコレータのパターンを実現できます
  • __invokeによってオブジェクトを呼び出し可能にできます(array_mapで役立ちます)
  • __debugInfoによって、var_dumpに機密データが表示されるのを防げます

クイックチェック

PHPのオブジェクトを関数のように呼び出し可能にするマジックメソッドは何ですか?

復習:PHPのマジックメソッド

PHPのマジックメソッドについて学習しました。覚えておくべき重要な点は次のとおりです:

  • オブジェクトを意味のある形で出力できるように、__toString()を使用します
  • __get/__setによってプロキシやデコレータのパターンを実現できます
  • __invokeによってオブジェクトを呼び出し可能にできます(array_mapで役立ちます)
  • __debugInfoによって、var_dumpに機密データが表示されるのを防げます

よくある質問

「マジックメソッドの概要」レッスンは無料ですか?

はい。「マジックメソッドの概要」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。

「マジックメソッドの概要」で何を学びますか?

__toString、__get、__setなど、PHPのマジックメソッドを学びます ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

PHP Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「マジックメソッドの概要」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPHP Academyレッスンでコードを書いて実行できますか?

はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. クラス、プロパティ、メソッド
  2. コンストラクタとデストラクタ
  3. 静的プロパティとメソッド
  4. マジックメソッドの概要
← PHP Academyに戻る