PHPインターフェースと抽象クラスの使用例を詳しく解説_PHPチュートリアル

WBOY
リリース: 2016-07-13 10:36:59
オリジナル
838 人が閲覧しました

1. 抽象クラス 抽象クラス

1.抽象クラスとは、クラスと抽象メソッド(クラスメソッドの関数キーワードの前に抽象キーワード)の前に抽象キーワードを追加したクラスを指します。

2.抽象クラスは直接インスタンス化できません。抽象クラスは、サブクラスに必要なメソッドのみを定義 (または部分的に実装) します。サブクラスは、抽象クラスを継承し、抽象クラス内のすべての抽象メソッドを実装することによって、抽象クラスを具体化できます。

3.サブクラスをインスタンス化する必要がある場合は、抽象クラス内のすべての抽象メソッドを実装する必要があります。サブクラスが抽象クラス内のすべての抽象メソッドを実装していない場合、サブクラスも抽象クラスであり、クラス内でその前にabstractキーワードを付ける必要があり、インスタンス化できません。

コードをコピーします コードは次のとおりです:

abstract class A
{ /**変数は抽象クラスで定義できます*/
protected $value1 = 0;
private $value2 = 1;
public $value3; = 2;
/**非抽象メソッドを定義することもできます*/
パブリック関数 my_print()
{
echo "hello,world/n";
抽象保護された abstract_func1(); function abstract_func2 {
//抽象保護関数 abstract_func2 ()

4.次のように A を継承するが、抽象メソッド abstract_func() を実装しないサブクラス B を作成するとします。



コードをコピーします

コードは次のとおりです:


クラス B は A{} を拡張します。
その後、プログラムには次のエラーが発生します:




コードをコピーする

コードは次のとおりです:


致命的なエラー: クラス B には 1 つの抽象メソッドが含まれているため、抽象として宣言するか、残りのメソッド (A::abstract_func) を実装する必要があります

5. B が抽象メソッド abstract_func() を実装する場合、B の abstract_func() メソッドのアクセス制御は、A の abstract_func() のアクセス制御よりも厳密にすることはできません。つまり、

(1) A の abstract_func() が public として宣言されている場合、B の abstract_func() の宣言は public のみにすることができ、protected または private にすることはできません

(2) A の abstract_func() が protected として宣言されている場合、B の abstract_func() の宣言は public または protected にすることができますが、private にすることはできません

(3) A の abstract_func() が private として宣言されている場合、おいおい、private として定義することはできません。 (致命的なエラー: 抽象関数 A::abstract_func() はプライベートとして宣言できません)

2.インターフェースインターフェース

1.抽象クラスは具体的な実装の標準を提供しますが、インターフェイスは純粋なテンプレートです。インターフェイスは関数のみを定義し、実装内容は定義しません。インターフェースはキーワードinterfaceで宣言されます。

2.インターフェイスは完全に抽象的であり、メソッドとパブリック メソッドのみを宣言でき、メソッド本体を定義できず、インスタンス変数も宣言できません。ただし、インターフェイスでは定数変数を宣言できます。しかし、インターフェイスに定数変数を配置すると、インターフェイスとして存在する目的に違反し、インターフェイスとクラスのさまざまな値が混乱します。本当に必要な場合は、対応する抽象クラスまたはクラスに配置できます。

コードは次のとおりです;

3.インターフェースを実装するクラスは、インターフェースに定義されているすべてのメソッドを実装する必要があります

コードをコピーします

コードは次のとおりです:


class E は iA を実装します
{
public function iAfunc1(){echo "in iAfunc1";}
public function iAfunc2(){echo "in iAfunc2" ;} }

それ以外の場合は、クラスを抽象として宣言する必要があります。
コードをコピーします

コードは次のとおりです:


抽象クラス E は iA を実装します{}

4.クラスは、宣言内でimplements キーワードを使用してインターフェイスを実装できます。これを実行した後、インターフェイスを実装する具体的なプロセスは、抽象メソッドのみを含む抽象クラスを継承するのと同じになります。クラスは親クラスを継承し、同時に任意の数のインターフェイスを実装できます。 extends 節は、implements 節の前に置く必要があります。 PHP は 1 つの親クラスからの継承のみをサポートするため、extends キーワードの後に​​はクラス名のみを指定できます。

コードをコピーします コードは次のとおりです:

インターフェース iB
{
パブリック関数 iBfunc1(); 
パブリック関数 iBfunc2(); 
}
クラス D は、A を拡張して iA,iB を実装します
{
パブリック関数 abstract_func1()
{
echo "クラス A/n に abstract_func1 を実装します"; 
}
public function abstract_func2()
{
echo "クラス A/n に abstract_func2 を実装"; 
}
public function iAfunc1(){echo "in iAfunc1";}
public function iAfunc2(){echo "in iAfunc2";}
public function iBfunc1(){echo "in iBfunc1";}
public function iBfunc2 () {echo "in iBfunc2";}
}

class D 拡張 B 実装 iA,iB
{
public function abstract_func1()
{
parent::abstract_func1(); 
echo "クラス A/n の abstract_func1 をオーバーライド"; 
}
public function abstract_func2()
{
echo "クラス A/n に abstract_func2 を実装"; 
}
public function iAfunc1(){echo "in iAfunc1";}
public function iAfunc2(){echo "in iAfunc2";}
public function iBfunc1(){echo "in iBfunc1";}
public function iBfunc2 () {echo "iBfunc2";}
}

5 .インターフェースは实现另一個のインターフェースは不可ですが、複数のインターフェースは承れます

复制代码代码如下:
インターフェース iC は iA,iB を拡張します{}
クラス F は iC を実装します
{
public function iAfunc1(){echo "in iAfunc1";}
パブリック関数 iAfunc2(){ echo "in iAfunc2";}
public function iBfunc1(){echo "in iBfunc1";}
public function iBfunc2(){echo "in iBfunc2";}
}

3. 抽象クラスとインターフェースの類似点と相違点

1. 類似点:

(1) どちらも抽象クラスなのでインスタンス化できません。

(2) インターフェース実装クラスと抽象クラスのサブクラスは、宣言された抽象メソッドを実装する必要があります。

2. 違い:

(1) インターフェースを実装する必要があるので、implements を使用し、抽象クラスを継承する必要があるので、 extends を使用します。

(2) クラスは複数のインターフェースを実装できますが、継承できる抽象クラスは 1 つだけです。

(3) インターフェースは特定の機能の実装を重視し、抽象クラスは所有関係を重視します。

(4) インターフェース実装クラスと抽象クラスのサブクラスは両方とも対応する抽象メソッドを実装する必要がありますが、実装形式が異なります。インターフェイス内のすべてのメソッドは抽象メソッドであり、宣言のみが行われ (宣言、メソッド本体はありません)、実装クラスはそれを実装する必要があります。抽象クラスのサブクラスは選択的に実装できます。この選択には次の 2 つの意味があります。 a) 抽象クラス内のすべてのメソッドが抽象であるわけではなく、抽象を持つメソッドだけが抽象であり、サブクラスはそれらを実装する必要があります。抽象を持たないメソッドの場合は、メソッド本体を抽象クラスで定義する必要があります。b) 抽象クラスのサブクラスがそれを継承する場合、非抽象メソッドを直接継承またはオーバーライドできます。また、抽象メソッドの場合は、実装するかオーバーライドするかを選択できます。実装はそのサブクラスに任せることができますが、このクラスも抽象として宣言する必要があります。抽象クラスなので当然インスタンス化できません。

(5) 抽象クラスはインターフェイスとクラスの間の仲介者です。抽象クラスはインターフェイスとクラスを接続する役割を果たします。一方では、抽象クラスは抽象的であり、サブクラスが実装する必要がある関数を標準化するために抽象メソッドを宣言できます。他方では、サブクラスによって直接使用またはオーバーライドされるデフォルトのメソッド本体を定義できます。さらに、継承を通じてサブクラスで使用する独自のインスタンス変数を定義できます。

(6) インターフェース内の抽象メソッドの前に抽象キーワードを追加することはできません。抽象メソッドはデフォルトで暗黙的であり、抽象メソッドの継承を防ぐために、final キーワードを追加することはできません。抽象クラスでは、抽象メソッドとして明示的に宣言されていることを示すために、抽象メソッドの前に abstract を追加する必要があります。

(7) インターフェイスの抽象メソッドはデフォルトでパブリックであり、プライベート修飾子または保護された修飾子を使用してのみ変更できます。抽象クラスの抽象メソッドは、public および protected で変更できますが、private で変更することはできません。

3. インターフェースの応用シナリオ

(1) クラスは、実装方法に関係なく、調整のために特定のインターフェイスを必要とします。

(2) 特定の機能を実現できる識別子として存在する場合もあれば、インターフェースメソッドを持たない純粋な識別子である場合もあります。

(3) クラスのグループを単一のクラスとして扱う必要があり、呼び出し元はインターフェイスを介してのみこのクラスのグループに連絡します。

(4) 複数の特定の機能を実装する必要があり、それらの機能はまったく関連していない可能性があります。

4. 抽象クラスの応用場面

一言で言えば、統一されたインターフェースとインスタンス変数またはデフォルトメソッドの両方が必要な場合に使用できます。最も一般的なものは次のとおりです:

(1) インターフェイスのセットを定義しますが、各実装クラスにすべてのインターフェイスの実装を強制したくありません。抽象クラスを使用してメソッド本体のセット、または空のメソッド本体を定義すると、サブクラスが対象となるメソッドを選択できます。

(2) 場合によっては、純粋なインターフェイスだけではクラス間の調整を満たすことができず、異なる関係を区別するためにクラス内の状態を表す変数も使用する必要があります。抽象の仲介的な役割はこれによく役立ちます。

(3) 相互に調整されたメソッドのセットを標準化します。一部のメソッドは共通で状態に依存せず、サブクラスが個別に実装する必要がなく共有できますが、他のメソッドは各サブクラスが独自の仕様に従って実装する必要があります。特定の機能を実装します。

www.bkjia.com本当http://www.bkjia.com/PHPjc/736826.html技術記事 1. 抽象クラス 抽象クラス 1.抽象クラスとは、クラスと抽象メソッド(クラスメソッドの関数キーワードの前に抽象キーワード)の前に抽象キーワードを追加したクラスを指します。 ...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート