私は最近 PHP+MySQL を学習し始めました。学習プロセスの重要なポイントを記録してから、Web サイトの開発プロセスについて一連のブログを書くことを検討してみましょう。
このブログでは主にAbstract ClassとInterfaceの違いを紹介します。
C++ の抽象クラスの概念と同様に、純粋仮想関数 (Java や Php では 抽象メソッド と呼ばれます) を含むクラスは、抽象クラスと呼ばれます。 基本クラスはオブジェクトを直接生成できないため、抽象クラスを基本クラスと呼ぶことがあります。
コードを見てみましょう:
リーリー
PHP の抽象クラスは他の oop 言語と同じです。このクラスのオブジェクトを直接生成する場合は、キーワード abstract を使用します。
リーリー
testChild は、キーワード extends を通じて抽象クラス testParent を継承し、testChild オブジェクトを生成できます。
C++ の純粋仮想関数と同様に、抽象メソッドは抽象クラスでのみ宣言でき、サブクラスでのみ定義できますし、定義する必要があります。
実際、この記述は絶対的なものではありませんが、記憶を容易にするために、ほとんどの教科書では、効果的な C++ の純粋仮想関数の説明を確認してみましょう。
「純粋な仮想関数は派生クラスで再宣言する必要がありますが、独自の実装を持つこともできます」
リーリー リーリー 実際、派生クラス ModelA の仮想メソッドに対して インライン呼び出し を実行しました。
あなたがなりたいフライは 2 つの基本要素に分かれています:
宣言部分は(この派生クラスが使用する必要がある)インターフェイスを表します
定義部分はデフォルトの動作を反映します (派生クラスが使用できるものですが、明示的に要求した場合に限ります)
上記の内容は「効果的な C++ でプログラミングと設計を改善するための 55 の具体的な実践方法」からの抜粋です第 34 条: インターフェイスの継承と実装の継承を区別する
戻って、PHP での 抽象メソッド の実装について引き続き議論しましょう。
リーリー
抽象クラスで抽象メソッドを宣言したら、このクラスを継承するすべてのサブクラスでこのメソッドを宣言する必要があります。そうしないと、PHP がエラーを報告します。
リーリー
f1 関数は抽象クラスでは protected ですが、サブクラスでは public として宣言できることに注意してください。いいえ、公開よりも公開範囲が制限されていません。
oop のインターフェイスは、クラス内のメソッドのセットの定義を強制します。
インターフェースはユーザーにいくつかのメソッドの実装を強制します。たとえば、ID 属性と Name 属性の設定を必要とするクラスがある場合、このクラスをインターフェイスとして宣言すると、このクラスから継承するすべての派生クラスに setId 操作と setName 操作の実装が強制されます
リーリー
このインターフェースでは、メソッド xyz を宣言します。その後、いつでも、そのようなメソッド xyz はサブクラスで宣言する必要があります
リーリー
インターフェイスでは、publicのみを使用できますが、保護およびプライベート
は使用できません
リーリー extends キーワードを使用して、クラスと同じようにインターフェイスを継承できます。
ここでの template2 には template1 のすべての属性が含まれるため、template2 の実装クラス abc で関数 f1 と f2 を実装する必要があります。
複数のインターフェースを拡張することもできます:
リーリー
同時に、クラスは複数のインターフェース
を実装することもできますリーリー
インターフェースから継承されたメソッドは 同じパラメーター仕様を持つ必要があります たとえば、次のコードが可能です。
リーリー
しかし、このようなコードはエラーになります:
リーリー
ただし、2 つのメソッドのパラメータに同じ名前を付ける必要はありません。次のコードは実行可能です。
interface template1 { public function f1($a) } class test implements template1 { public function f1($name) { echo $name; } }
interface template1 { public function f1($a = 20) } class test implements template1 { public function f1($name = ankur) { echo $name; } }
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