学習内容: 抽象クラス、インターフェース、final、クラス定数
1. 抽象的な
実際の開発プロセスでは、一部のクラスはインスタンス化する必要がありません。たとえば、以前に学習した一部の親クラスは主にサブクラスに継承されるため、コードの再利用性が向上します
。
文法構造:
抽象クラス クラス名 {
属性 $name;
Method(){} //メソッドは抽象修飾子関数にすることもできます。メソッド名(){}
}
例:
抽象クラスの動物{
パブリック $name;
public $age;
// 抽象メソッドは、主にサブクラスを実装するためのメソッド本体を持つことができません;
抽象パブリック関数 cry();
//抽象クラスには抽象メソッドとインスタンス クラスのメソッドを含めることができます
パブリック関数 getname(){
echo $this->name;
}
}
クラス猫{
パブリック関数 cry(){
「ok」をエコーします;
}
}
理解: 動物クラスは実際には抽象的な概念であり、一部の動物に共通する属性や行動を規定していますが、実際にはそれ自体にはそれらの属性や行動はありません。別の例: 輸送、植物など
注:
1. クラスが abstract で変更された場合、そのクラスは抽象クラスになります。メソッドが abstract で変更された場合、そのメソッドはメソッド body => abstract function cry(); を持つことはできません。 {} も許可されていません
2. 抽象クラスはインスタンス化してはなりません。抽象クラスには抽象メソッドは必要ありませんが、クラスに抽象メソッドが含まれる場合は、クラスを抽象クラスとして宣言する必要があります。
3. クラスが別の抽象クラスを継承する場合、サブクラスはその抽象クラス内のすべての抽象メソッドを実装する必要があります (それ自体も抽象クラスとして宣言されている場合を除く)。
2. インターフェース
インターフェイスは、特定のクラスが使用する必要があるときに、いくつかの未実装のメソッドをカプセル化するものであり、特定の状況に応じてこれらのメソッドを書き出すことができます。
文法構造
インターフェイス インターフェイス名 {
//プロパティ、メソッド
//インターフェース内のメソッドにはメソッド本体を含めることはできません;
}
インターフェースの実装方法
class クラス名はインターフェイス名を実装します {
}
理解: インターフェイスは、より抽象的な抽象クラスです。抽象クラス内のメソッドはメソッド本体を持つことができますが、インターフェイス内のメソッドはメソッド本体を持つことができません。インターフェイスはプログラミングの多態性と、高い結合性と低い結合性の設計アイデアを実現します。
例:
// インターフェースは仕様と属性を定義し、通常は小文字の i で始まります。
インターフェイス iUSB{
パブリック関数 start();
パブリック関数 stop();
}
// カメラクラスを記述してインターフェースを実装させます
//クラスがインターフェースを実装する場合、クラスはインターフェースのすべてのメソッドを実装する必要があります
クラス Camera は iUsb{
を実装します
public function start(){
echo 'カメラ開始作業';
}
パブリック関数 stop(){
echo 'カメラ停止作業';
}
}
//携帯電話クラスを作成します www.2cto.com
クラス Phone は iUsb を実装します{
public function start(){
echo '電話での仕事';
}
パブリック関数 stop(){
echo '電話は仕事を停止します';
}
}
$c=新しいカメラ();
$c->start();
$p=新しい電話();
$p->start();
インターフェースを使用する場合:
1. 仕様を設定し、他のプログラマーに実装してもらいます
2. 同じレベルの複数のクラスで特定の機能を実装する必要があるが、実装方法が異なる場合
概要:
1. インターフェイスはインスタンス化できず、インターフェイス内のすべてのメソッドは本体を持つことができません。
2. クラスはカンマ (,) で区切って複数のインターフェースを実装できます。クラスのデモは if1,if2,if3 を実装します{}
3. インターフェースには属性を含めることができますが、定数は修飾子を持つことができません (デフォルトは public 修飾子です)。
例: インターフェイス iUsb{
const A=90;
}
echo iUSB::A;
4. インターフェイス内のすべてのメソッドはパブリックである必要があり、デフォルトはパブリックです。
5. インターフェイスは他のクラスを継承できませんが、他のインターフェイスを複数継承することはできます
。
例: インターフェイス インターフェイス名は if1,if2 を拡張します{}
6. クラスは親クラスを継承しながら他のインターフェースも継承できます
例: class test extends testbaseimplements test1,test2{}
インターフェイスの実装とクラスの継承
PHP の継承は単一継承です。つまり、クラスは 1 つの親クラスのみを継承できます。これは、サブクラスの機能の拡張に一定の影響を与えます。インターフェイスの実装は、継承されたクラスの補足として見ることができます。継承は階層関係であまり柔軟性がありませんが、インターフェイスの実装は水平関係であり、継承関係を壊すことなく特定の機能を拡張できます。
3. ファイナル
1. 特定のクラスを他のクラスに継承させたくない場合 (セキュリティ上の理由など)、final
の使用を検討できます。
文法:
最終クラス A{}
2. メソッドがサブクラスによってオーバーライドされないようにするには、final を使用してメソッドを変更することを検討できます。これは、メソッドの継承権がパブリックな変更に依存するためです。
例: クラス A{
最終的な公開関数 getrate($salary){
$salary*0.08 を返します;
}
}
クラス B は A を拡張します{
//ここでの親クラスの getrate メソッドは Final を使用しているため、ここで getrate をオーバーライドすることはできません
//パブリック関数 getrate($salary){
// $給与*0.01を返します
;
//}
}
3. Final は属性の変更には使用できません
4. クラス定数(const)
場合によっては、そのような要件が存在する可能性があります。メンバー変数を変更したくないが、変数の値を固定したい場合は、const 定数を使用できます (const 名はすべて大文字で、$ を除く必要があります)シンボルと定数は変更できません)
文法:
const constant name=constant value; //定数は変更できないため、初期値を割り当てる必要があります
電話:
クラス名::定数名 [self::定数名はこのクラス内で使用できます] または インターフェイス名::定数名 //インターフェイスでは定数のみ使用できます。変数は使用できません
例:
クラスA{
const TAX_RATE=0.08;
関数 給与税($salary){
return $salary*self::TAX_RATE;
}
}
$a=新しいA();
echo $a->paytax(100);
注:
1. 定数はサブクラスに継承できます
2. 定数はオブジェクトではなく、特定のクラスに属します
Bell のテクノロジー ブログからの抜粋