1.抽象クラス
抽象クラスのメカニズムでは、特定の詳細は継承者に任せて、共通の基本クラスを常に定義する必要があります。概念を抽象化することで、開発プロジェクトで拡張性の高いアーキテクチャを作成できます。クラス内の少なくとも 1 つのメソッドが抽象宣言されている場合は、クラスを抽象宣言する必要があります。抽象として定義されたメソッドは、その呼び出しメソッド (パラメーター) を宣言するだけであり、その特定の関数の実装を定義することはできません。クラス宣言で abstract 修飾子を使用すると、クラスを抽象として宣言できます。
1.1 メソッドプロトタイプ(プロトタイプ)
は、メソッドの定義からメソッド本体を削除した後のシグネチャを指します。これには、アクセス レベル、関数キーワード、関数名、パラメーターが含まれます。 ({}) や括弧内のコードは含まれません。たとえば、次のコードはメソッドのプロトタイプです:
抽象クラスを継承する場合、サブクラスは親クラスのすべての抽象メソッドを定義する必要があります。さらに、これらのメソッドのアクセス制御は親クラスのアクセス制御と同じ (またはより緩和された) 必要があります。
1.2 抽象クラスについて
クラスは、少なくとも 1 つの抽象メソッドを含む限り、抽象クラスとして宣言する必要があります。
抽象として宣言されたメソッドは、実装時に同じかそれより低いアクセス レベルを含める必要があります。
new キーワードを使用して抽象クラスのインスタンスを作成することはできません。
抽象として宣言されたメソッドには関数本体を含めることはできません。
拡張クラスを抽象クラスとして宣言した場合、抽象クラスを拡張するときにすべての抽象メソッドを実装する必要はありません。 (クラスが抽象クラスから継承する場合、基本クラスで宣言されたすべての抽象メソッドを実装していない場合も、そのクラスを抽象として宣言する必要があります。)
1.3 抽象クラスの使用
クラス ロードスターが Car
{
public $Speend;
パブリック関数 SetSpeend($speend = 0)
}
クラス ストリート
{
public $Cars ;
public $SpeendLimit ;
{
$this -> SpeedLimit = $speendLimit;
$this -> Cars = array();
}
保護された関数 IsStreetLegal($car)
$car-> ;getMaxSpeend() < $this -> 速度制限}
}
F PUBLIC FUNCTION Addcar ($ Car) {
IF ($ this-& gt; isstReythal ($ car)) {
'
[] = $ Car
} l else {
echo '車が速すぎます;ルートでは許可されませんでした。';
$Porsche911 = 新型ロードスター();
$Porsche911->SetSpeend(340);
$FuWaiStreet = 新しいストリート(80);
$FuWaiStreet->AddCar($Porsche911);
/**
*
* @result
*
* 車が速すぎるため、道路では許可されませんでした。[0.1 秒で終了]
*
*/
?>
2. オブジェクトインターフェース
インターフェースを使用すると、特定のクラスが実装する必要があるメソッドを指定できますが、これらのメソッドの特定の内容を定義する必要はありません。
インターフェースは、標準クラスを定義するのと同じように、interface キーワードを通じて定義されますが、その中で定義されているメソッドはすべて空です。
インターフェースで定義されるすべてのメソッドはパブリックである必要があります。これはインターフェースの特性です。
インターフェイスは、クラスを実装するために宣言する必要があるメソッドを宣言するために使用できるクラスのような構造です。たとえば、インターフェイスは、API の実装方法を定義せずに API を宣言するためによく使用されます。
ほとんどの開発者は、コードや生成されたドキュメント内のクラスと区別するために、インターフェース名に大文字の I を接頭辞として付けることを選択します。
2.1 使用インターフェース
extends キーワードを必要とする抽象クラスの統合とは異なり、インターフェイスの実装では、implements キーワードを使用します。クラスは複数のインターフェイスを実装できます。この場合、それらをカンマで区切る必要があります。クラスがインターフェイスを実装しているとマークされていても、そのインターフェイスのメソッドをすべて実装していない場合は、エラーがスローされます。
2.2 インターフェースを使用するケース
インターフェース ISpeendInfo
{
関数 GetMaxSpeend();
}
クラス Roadster は Car 実装 ISpeendInfo を拡張します
{
公開 $Spend;
パブリック関数 SetSpeend($speend = 0)
public function getMaxSpeend()
、、、、、、、、、、、、、、、、、、、、
{
パブリック $Cars ;
パブリック $SpeendLimit ;
保護機能ISSTREETLEGAL($ car)
if($ this-&gt; isstreythal($ car)){
[] = $ car;
}
。
$Porsche911 = 新型ロードスター();
$FuWaiStreet = 新しいストリート(80);
$FuWaiStreet->AddCar($Porsche911);
/**
*
* @result
*
* 車が速すぎるため、道路では許可されませんでした。[0.1 秒で終了]
*
*/
3.オペレーターのインスタンス
instanceof 演算子は、PHP5 の比較演算子です。左と右のパラメータを受け入れ、ブール値を返します。この演算子は、オブジェクトのインスタンスが特定の型であるか、型を継承しているか、またはクラスの特定のインターフェイスを実装しているかを判断するために使用されます。
コードをコピーします
コードは次のとおりです:
echo $Porsche911instanceof Car;
//result: 1
echo $Porsche911 instanceof ISpeendInfo;
//結果: 1
4. 契約上のプログラミング
契約的プログラミングとは、クラスを作成する前に宣言されたインターフェイスを実装するプログラミング手法を指します。このメソッドは、クラスを確実にカプセル化するのに非常に役立ちます。コントラクト プログラミング手法を使用すると、建築家が建物を建てる前に青写真を描くのと同じように、アプリケーションを作成する前にビューの機能を定義できます。
5.まとめ
抽象クラスはabstractキーワードを使用して宣言されたクラスです。クラスを抽象としてマークすると、宣言されたメソッドの実装を延期できます。メソッドを抽象として宣言するには、すべての中括弧を含むメソッド エンティティを削除し、メソッドが宣言されているコード行をセミコロンで終了します。
抽象クラスは直接インスタンス化できず、継承する必要があります。
クラスが抽象クラスから継承する場合、基本クラスで宣言されたすべての抽象メソッドを実装していないときも、そのクラスを抽象として宣言する必要があります。
インターフェースでは、メソッド本体なしでメソッドのプロトタイプを宣言できます。これは抽象クラスに非常に似ています。それらの違いは、インターフェイスではメソッド本体を使用してメソッドを宣言できないことと、使用する構文も異なることです。クラスに検出ルールを強制するには、extends キーワードの代わりにimplements キーワードを使用する必要があります。
場合によっては、クラスが特定のクラスの型であるかどうか、または特定のインターフェイスを実装しているかどうかを判断する必要があります。このタスクには、instanceof が適しています。 instanceof は、インスタンスが特定の型であるかどうか、インスタンスが特定の型を継承しているかどうか、インスタンスまたはその祖先クラスがクラス固有のインターフェイスを実装しているかどうかという 3 つのことをチェックします。
一部の言語には複数のクラスから継承する機能があり、これは多重継承と呼ばれます。 PHP は多重継承をサポートしていません。このアイデアは、クラスに対して複数のインターフェイスを宣言する機能を提供するというものです。
インターフェイスは、クラスが従わなければならないルールを宣言するのに非常に役立ちます。契約に基づくプログラミング テクノロジは、この機能を使用してカプセル化を強化し、ワークフローを最適化します。