Menu
Coddy logo textTech

匿名クラス

CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 58/91。

完全な Anonymous class を定義する負担なしに、単純な一度限りのオブジェクトが必要になることがあります。Anonymous class を使うと、必要な場所でその場でオブジェクトを作成できます。依存性注入と組み合わせると、特に便利です。

Anonymous クラスは、new classの後にクラス本体を記述して定義します。

<?php
$logger = new class {
    public function log(string $message): void {
        echo "Log: $message";
    }
};

$logger->log("Hello!");

出力:

Log: Hello!

Anonymous class はインターフェースを実装すると強力になります。テストを行う場合や、single-use class でコードベースを煩雑にすることなく、すぐに実装が必要な場合に最適です。

<?php
interface Notifier {
    public function send(string $message): string;
}

function notify(Notifier $notifier, string $msg): string {
    return $notifier->send($msg);
}

$result = notify(new class implements Notifier {
    public function send(string $message): string {
        return "Sent: $message";
    }
}, "Test message");

echo $result;

出力:

Sent: Test message

Anonymous クラスは、他のクラスを拡張したり、トレイトを使用したり、constructor の引数を受け取ったりすることもできます。これらは OOP の機能に完全にアクセスできます。別ファイルではなくインラインで定義されているだけです。完全な class 定義では大げさすぎるものの、オブジェクト指向の動作が必要な場合に使用してください。

challenge icon

チャレンジ

簡単

anonymous class の力を示す data formatter system を構築しましょう。単純な、一度きりの実装のために個別の class ファイルを作成する代わりに、必要な場所で直接すばやく実装を作成するために anonymous class を使用します。

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

  • FormatterInterface.php: FormatterInterface という名前の interface を Define し、単一の method format(string $data): string を持たせます。これにより、あらゆる formatter が従うべき contract が確立されます。
  • main.php: interface ファイルを読み込み、dependency injection を使用して任意の formatter を受け入れる DataProcessor class を Create します。この class は次のようにします。
    • constructor で FormatterInterface を受け入れる
    • 注入された formatter に処理を delegates し、その result を返す process(string $data) という method を have する

    2つの input を受け取ります。format type("upper" または "reverse")と、format する string です。

    format type に Based して、FormatterInterface を implements する anonymous class を Create します。

    • "upper" の場合: format() method は data を uppercase に変換したものを return する should
    • "reverse" の場合: format() method は data を reversed したものを return する should

    anonymous class を DataProcessor に注入し、input string を使って process() を Call し、result を print します。

この approach は、single-use class ファイルで codebase を clutter させずに、すばやい実装が必要な場合に最適です。anonymous class は inline で Create され、required interface を implements し、その interface が expected されるあらゆる場所に渡すことができます。

自分で試してみよう

<?php
require_once 'FormatterInterface.php';

// TODO: DataProcessor クラスを作成する:
// - コンストラクタで FormatterInterface を受け取る
// - process(string $data) メソッドを持ち、フォーマッターに委譲する

// 入力を読み取る
$formatType = trim(fgets(STDIN));
$inputString = trim(fgets(STDIN));

// TODO: Based on $formatType ("upper" or "reverse"), create an anonymous class
// FormatterInterface を実装する
// - "upper" の場合: format() はデータの大文字バージョンを返す
// - "reverse" の場合: format() はデータの逆順バージョンを返す

// TODO: Create a DataProcessor with your anonymous class formatter
// 入力文字列で process() を呼び出し、結果を出力する

?>
quiz icon腕試し

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

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

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