ホームページ  >  記事  >  バックエンド開発  >  PHPにおけるstatic、final、interface、abstractの違い

PHPにおけるstatic、final、interface、abstractの違い

不言
不言オリジナル
2018-07-05 11:19:454852ブラウズ

この記事では主に、PHP における static、final、interface、abstract の違いを紹介します。一定の参考値があります。ここで共有します。必要な友人は参考にしてください。

final

親クラスのメソッドがfinalと宣言されている場合、サブクラスはそのメソッドをオーバーライドできません。クラスがfinal宣言されている場合、そのクラスを継承することはできません。

注: プロパティを Final として定義することはできません。final として定義できるのはクラスとメソッドのみです。

static

静的変数には、ローカル変数またはグローバル変数があります。プログラムセグメントが実行されても、静的変数は消えません。メモリ内にまだ存在しており、次回定義されます。これは以前の値のままです。再帰またはサブ関数で以前の値を保持するためによく使用されます。変数やメソッドの定義に使用できます。これはシングルトン モードでも使用されます (

1)。一般に、静的属性はクラスのパブリック データを保存するために使用されます。

2. 静的メソッド内でアクセスできるのは、このクラスと親クラスのプロパティを含む静的プロパティのみです。

#3. 静的メンバーは次のとおりです。オブジェクトをインスタンス化せずにアクセスします

4. このクラス内の静的プロパティにアクセスするには、self または static キーワードを使用します。続く変数には、self::$a または static::$a

# のように、$ が含まれている必要があります。 ##5. 親クラスにアクセスする 静的属性にはparentを使用します (parent::$name

6. クラス外の静的変数またはメソッドにアクセスする場合は、インスタンス化せずにクラス名を使用して直接アクセスします) 。例: Me::$pan および Me::abc()

abstract

抽象クラスabstract class

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

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

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

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

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

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

(3) A の abstract_func() が private として宣言されている場合、次のように定義することはできません。プライベート! (

致命的エラー

: 抽象関数 A::abstract_func() はプライベートとして宣言できません ) interface

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

2 .インターフェイスは完全に抽象です。宣言できるのはメソッドとパブリック メソッドのみです。プライベート メソッドとプロテクト メソッドを宣言できず、メソッド本体を定義できず、インスタンス変数も宣言できません。

3.インターフェイスは定数変数を宣言できます。しかし、インターフェイスに定数変数を配置することは、インターフェイスとしての存在目的に違反し、インターフェイスとクラスの異なる値を混乱させます。本当に必要な場合は、対応する抽象クラスまたはクラスに配置できます。

4.インターフェイスを実装するクラスは、そのインターフェイスで定義されているすべてのメソッドを実装する必要があります。それ以外の場合、クラスは抽象として宣言される必要があります。

5.クラスは、宣言内でimplements キーワードを使用してインターフェイスを実装できます。これを実行した後、インターフェイスを実装する具体的なプロセスは、抽象メソッドのみを含む抽象クラスを継承するのと同じになります。

6.クラスは親クラスを継承し、同時に任意の数のインターフェイスを実装できます。 extends 句は、implements 句の前に置く必要があります。 PHP は 1 つの親クラスからの継承のみをサポートするため、extends キーワードの後に​​はクラス名のみを指定できます。 ######7。インターフェースは別のインターフェースを実装することはできませんが、複数のインターフェースを継承できます

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

##1. 類似点:

(1) 両方です抽象クラスなのでインスタンス化できません。

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

2. 相違点:

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

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

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

(4) インターフェース実装クラスと抽象クラスのサブクラスは、対応する抽象メソッドを実装する必要がありますが、実装形式が異なります。インターフェイス内のすべてのメソッドは抽象メソッドであり、宣言のみが行われ (宣言、メソッド本体はありません)、実装クラスはそれを実装する必要があります。抽象クラスのサブクラスは選択的に実装できます。

この選択には 2 つの意味があります:

a) 抽象クラスのすべてのメソッドが抽象であるわけではありません。抽象を持つメソッドのみが抽象であり、サブクラスはそれらを実装する必要があります。抽象を持たないメソッドの場合、メソッド本体は抽象クラスで定義する必要があります。

b) 抽象クラスのサブクラスがそれを継承する場合、非抽象メソッドを直接継承またはオーバーライドできますが、抽象メソッドの場合は、実装することを選択することも、そのサブクラスに任せることもできますが、このクラスは抽象クラスとしても宣言する必要があります。抽象クラスなので当然インスタンス化できません。

(5) 抽象クラスはインターフェースとクラスの仲介者です。抽象クラスはインターフェイスとクラスを接続する役割を果たします。

一方では、抽象クラスは抽象的であり、サブクラスが実装する必要がある関数を標準化するために抽象メソッドを宣言できます;

一方では、サブクラスが使用するデフォルトのメソッド本体を定義できます直接、またはオーバーライドします。さらに、継承を通じてサブクラスで使用する独自のインスタンス変数を定義できます。

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

(7) インターフェース内の抽象メソッドは、デフォルトでは public であり、public のみが可能であり、private または protected 修飾子で変更することはできません。抽象クラスの抽象メソッドは、public および protected で変更できますが、private で変更することはできません。

3. インターフェースの適用場面

(1) クラスは、その実装方法に関わらず、連携のために特定のインターフェースを必要とします。

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

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

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

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

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

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

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

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

上記がこの記事の全内容です。皆様の学習に少しでもお役に立てれば幸いです。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。

関連する推奨事項:

php の経度および緯度に基づく並べ替えと、経度および緯度に基づく距離セグメントのフィルタリング

PHP における Define と Const の違い

以上がPHPにおけるstatic、final、interface、abstractの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。