匿名クラス
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 messageAnonymous クラスは、他のクラスを拡張したり、トレイトを使用したり、constructor の引数を受け取ったりすることもできます。これらは OOP の機能に完全にアクセスできます。別ファイルではなくインラインで定義されているだけです。完全な class 定義では大げさすぎるものの、オブジェクト指向の動作が必要な場合に使用してください。
チャレンジ
簡単anonymous class の力を示す data formatter system を構築しましょう。単純な、一度きりの実装のために個別の class ファイルを作成する代わりに、必要な場所で直接すばやく実装を作成するために anonymous class を使用します。
コードを2つのファイルに整理します。
FormatterInterface.php:FormatterInterfaceという名前の interface を Define し、単一の methodformat(string $data): stringを持たせます。これにより、あらゆる formatter が従うべき contract が確立されます。main.php: interface ファイルを読み込み、dependency injection を使用して任意の formatter を受け入れるDataProcessorclass を 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 します。- constructor で
この 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() を呼び出し、結果を出力する
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ