Dog構造体 type Dog struct{} func (d Dog) Speak() { fmt.Println("I am a dog.") } // Robot構造体 type Robot struct{} func (r Robot) Speak() { fmt.Println("I am a robot.") } func introduce(s Speaker) { s.Speak() } func main() { // Dog, Robot はSpeakerインターフェイスを満たす d := Dog{} r := Robot{} // 振る舞いを切り替えられる introduce(d) // "I am a dog." introduce(r) // "I am a robot." }
function speak(): void; } // Dog クラス class Dog implements Speaker { public function speak(): void { echo "I am a dog." . PHP_EOL; } } // Robot クラス class Robot implements Speaker { public function speak(): void { echo "I am a robot." . PHP_EOL; } } function introduce(Speaker $speaker): void { $speaker->speak(); } // メイン処理 $dog = new Dog(); $robot = new Robot(); introduce($dog); // 出力: I am a dog. introduce($robot); // 出力: I am a robot.
methodOne(): void; public function methodTwo(): void; } // methodOneのみを持つ //(TwoMethodsインターフェイスを実装しない, できない) class PartialOne { public function methodOne(): void {} } // methodOneとmethodTwoを持つ(TwoMethodsインターフェイスを実装) class PartialTwo implements TwoMethods { public function methodOne(): void {} public function methodTwo(): void {} } // 3つのメソッドを持つが、TwoMethodsの2つを実装している class ExtraMethods implements TwoMethods { public function methodOne(): void {} public function methodTwo(): void {} public function methodThree(): void {} } // TwoMethodsインターフェイスを受け取る関数 function useTwoMethods(TwoMethods $t): void { $t->methodOne(); $t->methodTwo(); } // メイン処理 function main(): void { $partialOne = new PartialOne(); $partialTwo = new PartialTwo(); $extraMethods = new ExtraMethods(); $partialOne->methodOne(); // エラー: PartialOneはTwoMethodsを実装していない // useTwoMethods($partialOne); useTwoMethods($partialTwo); // 正常に動作する useTwoMethods($extraMethods); // 正常に動作する } main();
methodOne(): void; public function methodTwo(): void; } // methodOneのみを持つ //(TwoMethodsインターフェイスを実装しない, できない) class PartialOne { public function methodOne(): void {} } // methodOneとmethodTwoを持つ(TwoMethodsインターフェイスを実装) class PartialTwo implements TwoMethods { public function methodOne(): void {} public function methodTwo(): void {} } // 3つのメソッドを持つが、TwoMethodsの2つを実装している class ExtraMethods implements TwoMethods { public function methodOne(): void {} public function methodTwo(): void {} public function methodThree(): void {} } // TwoMethodsインターフェイスを受け取る関数 function useTwoMethods(TwoMethods $t): void { $t->methodOne(); $t->methodTwo(); } // メイン処理 function main(): void { $partialOne = new PartialOne(); $partialTwo = new PartialTwo(); $extraMethods = new ExtraMethods(); $partialOne->methodOne(); // エラー: PartialOneはTwoMethodsを実装していない // useTwoMethods($partialOne); useTwoMethods($partialTwo); // 正常に動作する useTwoMethods($extraMethods); // 正常に動作する } main(); methodTwo()を実装して TwoMethodsをimplements する必要がある
class MySQLUserRepository implements UserRepositoryInterface { public function getUserByID(int $id): ?User { echo "MySQLデータベースからユーザーを取得します\n"; return new User($id, "MySQL User"); } public function saveUser(User $user): void { echo "MySQLデータベースにユーザーを保存します\n"; } }
class MySQLUserRepository implements UserRepositoryInterface { public function getUserByID(int $id): ?User { echo "MySQLデータベースからユーザーを取得します\n"; return new User($id, "MySQL User"); } public function saveUser(User $user): void { echo "MySQLデータベースにユーザーを保存します\n"; } } 明示的だね