ホームページ >バックエンド開発 >PHPチュートリアル >PHP_PHP チュートリアルの抽象クラスとインターフェイス

PHP_PHP チュートリアルの抽象クラスとインターフェイス

WBOY
WBOYオリジナル
2016-07-13 09:54:181776ブラウズ

PHP の抽象クラスとインターフェイス

私は最近 PHP+MySQL を学習し始めました。学習プロセスの重要なポイントを記録してから、Web サイトの開発プロセスについて一連のブログを書くことを検討してみましょう。

このブログでは主にAbstract ClassInterfaceの違いを紹介します。

抽象クラス

抽象クラスとは

C++ の抽象クラスの概念と同様に、純粋仮想関数 (Java や Php では 抽象メソッド と呼ばれます) を含むクラスは、抽象クラスと呼ばれます。 基本クラスはオブジェクトを直接生成できないため、抽象クラスを基本クラスと呼ぶことがあります。

PHPの抽象クラス

コードを見てみましょう:

リーリー

PHP の抽象クラスは他の oop 言語と同じです。このクラスのオブジェクトを直接生成する場合は、キーワード abstract を使用します。

リーリー

testChild は、キーワード extends を通じて抽象クラス testParent を継承し、testChild オブジェクトを生成できます。

抽象メソッドを実装する

C++ の純粋仮想関数と同様に、抽象メソッドは抽象クラスでのみ宣言でき、サブクラスでのみ定義できますし、定義する必要があります。

実際、この記述は絶対的なものではありませんが、記憶を容易にするために、ほとんどの教科書では、効果的な C++ の純粋仮想関数の説明を確認してみましょう。

「純粋な仮想関数は派生クラスで再宣言する必要がありますが、独自の実装を持つこともできます」

リーリー リーリー 実際、派生クラス ModelA の仮想メソッドに対して インライン呼び出し を実行しました。

あなたがなりたいフライは 2 つの基本要素に分かれています:

宣言部分は(この派生クラスが使用する必要がある)インターフェイスを表します

定義部分はデフォルトの動作を反映します (派生クラスが使用できるものですが、明示的に要求した場合に限ります)


上記の内容は「効果的な C++ でプログラミングと設計を改善するための 55 の具体的な実践方法」からの抜粋です第 34 条: インターフェイスの継承と実装の継承を区別する

戻って、PHP での 抽象メソッド の実装について引き続き議論しましょう。

リーリー
abc では、キーワード abstract を使用して抽象メソッド f1 を宣言します。 PHPの場合

抽象クラスで抽象メソッドを宣言したら、このクラスを継承するすべてのサブクラスでこのメソッドを宣言する必要があります。そうしないと、PHP がエラーを報告します。

リーリー
上記のコードからわかるように、プライベート抽象メソッドは現在のクラスでのみ使用できるため、プライベート抽象メソッドを宣言するとエラーが報告されます。

f1 関数は抽象クラスでは protected ですが、サブクラスでは public として宣言できることに注意してください。いいえ、公開よりも公開範囲が制限されていません。

インターフェース

oop のインターフェイスは、クラス内のメソッドのセットの定義を強制します。

インターフェースはユーザーにいくつかのメソッドの実装を強制します。たとえば、ID 属性と Name 属性の設定を必要とするクラスがある場合、このクラスをインターフェイスとして宣言すると、このクラスから継承するすべての派生クラスに setId 操作と setName 操作の実装が強制されます

phpのインターフェース

リーリー
他の oop 言語と同様に、キーワード Interface を使用して宣言します。

このインターフェースでは、メソッド xyz を宣言します。その後、いつでも、そのようなメソッド xyz はサブクラスで宣言する必要があります

リーリー
キーワード implements を使用してインターフェースから継承できます。

インターフェイスでは、publicのみを使用できますが、保護およびプライベート

は使用できません

リーリー extends キーワードを使用して、クラスと同じようにインターフェイスを継承できます。

ここでの template2 には template1 のすべての属性が含まれるため、template2 の実装クラス abc で関数 f1 と f2 を実装する必要があります。


複数のインターフェースを拡張することもできます:

リーリー

同時に、クラスは複数のインターフェース

を実装することもできます

リーリー
ただし、2 つのインターフェイスに同じ名前のメソッドが含まれている場合、クラスはそれらを同時に実装できません。

インターフェースから継承されたメソッドは 同じパラメーター仕様を持つ必要があります たとえば、次のコードが可能です。

リーリー

しかし、このようなコードはエラーになります:

リーリー

ただし、2 つのメソッドのパラメータに同じ名前を付ける必要はありません。次のコードは実行可能です。

interface template1
{
public function f1($a)
}
class test implements template1
{
public function f1($name)
{
echo $name;
}
}

同时,如果使用default value,你还可以改变参数的default value,下面的代码是可行的:

 

 

interface template1
{
public function f1($a = 20)
}
class test implements template1
{
public function f1($name  = ankur)
{
echo $name;
}
}


 

Abstract Class和Interface之间的不同:

1. In abstract classes this is not necessary that every method should be abstract. But in interface every method is abstract.

在Abstract class中并非所有的method都必须是抽象的,但是在interface中所有的method都自动成为抽象的。就是在子类中必须声明和实现

2. Multiple and multilevel both type of inheritance is possible in interface. But single and multilevel inheritance is possible in abstract classes.

multiple和multilevel inheritance,我不知道改怎么翻译更好,multiple inheritance意思是 在interface中,一个class可以同时implements好多个interface;但是在abstract classes中,只能extends一个class。

当然你extends的这个class可能又extentds别的class,这就是所谓的multilevel inheritance。

3. Method of php interface must be public only. Method in abstract class in php could be public or protected both.

interface中的method必须是public的,但是在abstract class中可以是public或者protected。

4. In abstract class you can define as well as declare methods. But in interface you can only defined your methods.

在abstract class中你可以同时声明(declare)和定义(define)methodes,但是在interface中你只能定义那个methods

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/998009.htmlTechArticlePHP中的Abstract Class和Interface 最近开始学习 PHP+MySQ L,记录下学习过程中的重点内容吧,然后考虑把开发网站的过程也写一个系列Blog。 这篇...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。