PHP クラスは単一継承ですが、クラスの特性がインターフェイスに抽象化され、インターフェイスを実装することでオブジェクトが複数の ID を持つ限り、インターフェイスの使用など、他の特別なメソッドを通じて多重継承を実現できます。これにより、多重継承をシミュレートできます。
以下は、インターフェイスを使用して多重継承をシミュレートする例です。ソース コードは次のとおりです。
- interface?UserInterface{?// ユーザー インターフェイスを定義します ?
- ?関数?getname();
- } ?
- interface?TeacherInterface{?//教師関連のインターフェイス ?
- ?関数?getLengthOfService()?
- } ?
- class?User?implements?UserInterface?{?// UserInterface インターフェイスを実装します ?
- ?private?$name?=?"トム" ?
- ?public?function?getName(){ ?
- ??return?$this->name ?
- ?} ?
- } ?
- class?Teacher?implements?TeacherInterface?{?// TeacherInterface インターフェイスを実装します ?
- ?private?$lengthOfService?=?5;?//?優先度?
- ?public?function?getLengthOfService(){ ?
- ??return?$this->lengthOf?
- ?} ?
- } ?
- //?User クラスから継承し、TeacherInterface インターフェイスを実装します。
- class?GraduateStudent?extends?User?implements?TeacherInterface?{ ?
- ?プライベート?$教師??
- ?public?function?__construct(){ ?
- ??$this->Teacher?=?new?Teacher();?
- ?}?
- ?public?function?getLengthOfService(){ ?
- ??return?$this->Teacher->getLengthOfService() ?
- ?} ?
- } ?
- クラス?アクト{ ?
- ?//ここでの型ヒントはインターフェイスの型に変更されていることに注意してください?
- ?public?static?function?getUserName(UserInterface?$_user){ ?
- ??echo?"名前は?"?.?$_user->getName()?."
"; ?} ? - ?//ここの型ヒントは TeacherInterface 型に変更されます。
- ?public?static?function??getLengthOfService(TeacherInterface?$_Teacher){ ?
- ??echo?"年齢は?"?.$_Teacher->getLengthOfService()?."
"; ?} ? - } ?
- $graduateStudent?=?new?GraduateStudent() ?
- Act::getUserName($graduateStudent) ?
- Act::getLengthOfService($graduateStudent) ?
- //結果はまさに私たちが望んでいたものであり、複数のアイデンティティを持つオブジェクトが実現されます。
- ?>?
- サンプルの実行結果は次のとおりです:
- 名前はトムです