ホームページ  >  記事  >  バックエンド開発  >  PHP オブジェクト指向の抽象クラス、オブジェクト インターフェイス、instanceof、およびコントラクト プログラミングのチュートリアル

PHP オブジェクト指向の抽象クラス、オブジェクト インターフェイス、instanceof、およびコントラクト プログラミングのチュートリアル

伊谢尔伦
伊谢尔伦オリジナル
2017-06-29 09:43:121438ブラウズ

オブジェクト指向プログラミング OOP (OOP) は、コンピューター プログラミング アーキテクチャです。 OOP の基本原理の 1 つは、コンピューター プログラムがサブルーチンとして機能できる単一のユニットまたはオブジェクトで構成されるということです。 OOP は、再利用性、柔軟性、拡張性というソフトウェア エンジニアリングの 3 つの主な目標を達成します。全体的な操作を実装するために、各オブジェクトは情報を受信し、データを処理し、他のオブジェクトに情報を送信できます。 1.

PHP の抽象クラス

PHP 5 は、抽象クラスと抽象メソッドをサポートします。抽象として定義されたクラスはインスタンス化できません。クラス内の少なくとも 1 つのメソッドが抽象宣言されている場合、クラスは抽象宣言されている必要があります。抽象として定義されたメソッドは、その呼び出しメソッド (パラメーター) を宣言するだけであり、その特定の関数の実装を定義することはできません。クラスは、宣言内で abstract 修飾子を使用することで抽象として宣言できます。

抽象クラスは基本クラスとして機能し、具体的な詳細は後続者に任せることが理解できます。概念を抽象化することで、開発プロジェクトで拡張性の高いアーキテクチャを作成できます。

abstract class AbstractClass
{
    code...
}

1.1. 抽象メソッド

抽象メソッドを定義するには、abstract キーワードを使用します。抽象メソッドは、アクセス レベル、関数キーワード、関数名、パラメータを含むメソッド プロトタイプ (メソッド本体がメソッド定義から削除された後のシグネチャ) のみを保持します。 ({}) や括弧内のコードは含まれません。たとえば、次のコードは抽象メソッド定義です。

abstract public function prototypeName($protoParam);

抽象クラスを継承する場合、サブクラスは親クラス内のすべての抽象メソッドを定義する必要があり、さらに、これらのメソッドの

アクセス制御

が同じである必要があります。親クラス (または緩い場合はそれ以上)。さらに、メソッドを呼び出すメソッドは一致している必要があります。つまり、必要なパラメータの型と数が一致している必要があります。 1.2. 抽象クラスについて

クラスに少なくとも 1 つの抽象メソッドが含まれている限り、抽象クラスとして宣言する必要があります

抽象として宣言されたメソッドは、実装時に同じかそれより低いアクセス レベルを含める必要があります。

new キーワードを使用して抽象クラスのインスタンスを作成することはできません。
抽象として宣言されたメソッドには関数本体を含めることはできません。
拡張クラスが抽象クラスとしても宣言されている場合、抽象クラスを拡張するときにすべての抽象メソッドを実装する必要はありません。 (クラスが抽象クラスから継承する場合、基底クラスで宣言されたすべての抽象メソッドを実装していない場合にも、そのクラスを抽象として宣言する必要があります。)
1.3. 抽象クラスの使用

<?php
abstract class Car
{    
    abstract function getMaxSpeend();
}
class Roadster extends Car
{
    public $Speend;
    public function SetSpeend($speend = 0)
    {
        $this->Speend = $speend;
    }
    public function getMaxSpeend()
    {
        return $this->Speend;
    }
}
class Street
{
    public $Cars ;
    public $SpeendLimit ;
    function construct( $speendLimit = 200)
    {
        $this -> SpeendLimit = $speendLimit;
        $this -> Cars = array();
    }
    protected function IsStreetLegal($car)
    {
        if ($car->getMaxSpeend() < $this -> SpeendLimit)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    public function AddCar($car)
    {
        if($this->IsStreetLegal($car))
        {
            echo &#39;The Car was allowed on the road.&#39;;
            $this->Cars[] = $car;
        }
        else
        {
            echo &#39;The Car is too fast and was not allowed on the road.&#39;;
        }
    }
}
$Porsche911 = new Roadster();
$Porsche911->SetSpeend(340);
$FuWaiStreet = new Street(80);
$FuWaiStreet->AddCar($Porsche911);
/**
 *
 * @result
 * 
 * The Car is too fast and was not allowed on the road.[Finished in 0.1s]
 *
 */
?>

2.


オブジェクトインターフェイス インターフェースを使用すると、クラスが実装する必要があるメソッドを指定できますが、これらのメソッドの特定の内容を定義する必要はありません。

インターフェースは、標準クラスを定義するのと同じように、interface キーワードを通じて定義されますが、その中で定義されているメソッドはすべて空です。

インターフェースで定義されるすべてのメソッドはパブリックである必要があります。これはインターフェースの特性です。

インターフェイスは、クラスを実装するために宣言する必要があるメソッドを宣言するために使用できるクラスに似た構造です。たとえば、インターフェイスは、API の実装方法を定義せずに API を宣言するためによく使用されます。

ほとんどの開発者は、コードや生成されたドキュメント内のクラスと区別するために、インターフェース名に大文字の I を接頭辞として付けることを選択します。

2.1 インターフェイスの実装

インターフェイスを実装するには、implements 演算子を使用します (抽象クラスを継承するには、extends キーワードを別の方法で使用する必要があります)。クラスは、インターフェイスで定義されているすべてのメソッドを実装する必要があります。実装しない場合は、致命的なエラーが報告されます。クラスは複数のインターフェイスを実装できます。複数のインターフェイスの名前を区切るにはカンマを使用します。

複数のインターフェースを実装する場合、インターフェース内のメソッドに同じ名前を付けることはできません。

extends 演算子を使用してインターフェイスを継承することもできます。

インターフェイスを実装するには、クラスはインターフェイスで定義されているメソッドとまったく同じメソッドを使用する必要があります。そうしないと、致命的なエラーが発生します。
定数はインターフェースでも定義できます。インターフェイス定数はクラス定数とまったく同じように使用されますが、サブクラスまたはサブインターフェイスによってオーバーライドすることはできません。
2.2 インターフェースを使用する場合

<?php
abstract class Car
{    
    abstract function SetSpeend($speend = 0);
}
interface ISpeendInfo
{
    function GetMaxSpeend();
}
class Roadster extends Car implements ISpeendInfo
{
    public $Speend;
    public function SetSpeend($speend = 0)
    {
        $this->Speend = $speend;
    }
    public function getMaxSpeend()
    {
        return $this->Speend;
    }
}
class Street
{
    public $Cars ;
    public $SpeendLimit ;
    function construct( $speendLimit = 200)
    {
        $this -> SpeendLimit = $speendLimit;
        $this -> Cars = array();
    }
    protected function IsStreetLegal($car)
    {
        if ($car->getMaxSpeend() < $this -> SpeendLimit)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    public function AddCar($car)
    {
        if($this->IsStreetLegal($car))
        {
            echo &#39;The Car was allowed on the road.&#39;;
            $this->Cars[] = $car;
        }
        else
        {
            echo &#39;The Car is too fast and was not allowed on the road.&#39;;
        }
    }
}
$Porsche911 = new Roadster();
$Porsche911->SetSpeend(340);
$FuWaiStreet = new Street(80);
$FuWaiStreet->AddCar($Porsche911);
/**
 *
 * @result
 * 
 * The Car is too fast and was not allowed on the road.[Finished in 0.1s]
 *
 */
?>

3.

型演算子instanceof instanceof演算子は、PHP5の比較演算子です。左と右のパラメータを受け入れ、ブール値を返します。

PHP 変数が特定のクラス CLASS のインスタンスに属しているかどうかを判断します

オブジェクトが特定の型を継承しているかどうかを確認します

オブジェクトが特定のクラスのインスタンスに属しているかどうかを確認します
変数がオブジェクトのインスタンスであるかどうかを判断します特定のインターフェイスを実装する

echo $Porsche911 instanceof Car;
//result:1
echo $Porsche911 instanceof ISpeendInfo;
//result:1

4.

契約によるプログラミング

契約による設計または契約による設計(DbC)は、コンピューターソフトウェアを設計する方法です。このアプローチでは、ソフトウェア設計者がソフトウェア コンポーネントの形式的で正確な検証可能なインターフェイスを定義する必要があります。このようにして、従来のデータ型の抽象化に事前条件、事後条件、不変条件が追加されます。このメソッドの名前に使用されている「契約」または「契約」は、ビジネス契約の状況に似ているため、比喩です。

クラスを作成する前に、宣言されたインターフェイスを実装するプログラミングの練習。このメソッドは、クラスを確実にカプセル化するのに非常に役立ちます。コントラクト プログラミング手法を使用すると、建築家が建物を建てる前に青写真を描くのと同じように、アプリケーションを作成する前にビューの機能を定義できます。

5.概要

抽象クラスは、abstractキーワードを使用して宣言されたクラスです。クラスを抽象としてマークすると、宣言されたメソッドの実装を延期できます。メソッドを抽象として宣言するには、すべての中括弧を含むメソッド エンティティを削除し、メソッドが宣言されているコード行をセミコロンで終了します。

抽象クラスは直接インスタンス化できず、継承する必要があります。

クラスが抽象クラスから継承する場合、基本クラスで宣言されたすべての抽象メソッドを実装していない場合も、そのクラスを抽象として宣言する必要があります。

インターフェースでは、メソッド本体なしでメソッドのプロトタイプを宣言できます。これは抽象クラスと非常によく似ています。それらの違いは、インターフェイスではメソッド本体を使用してメソッドを宣言できないことと、使用する構文も異なることです。クラスに検出ルールを強制するには、extends キーワードの代わりにimplements キーワードを使用する必要があります。

場合によっては、クラスが特定のクラスの型であるかどうか、または特定のインターフェイスを実装しているかどうかを判断する必要があります。このタスクには、instanceof が適しています。 instanceof は、インスタンスが特定の型であるかどうか、インスタンスが特定の型を継承しているかどうか、インスタンスまたはその祖先クラスがクラス固有のインターフェイスを実装しているかどうかという 3 つのことをチェックします。

一部の言語には複数のクラスから継承する機能があり、これは多重継承と呼ばれます。 PHP は多重継承をサポートしていません。このアイデアは、クラスに対して複数のインターフェイスを宣言する機能を提供するというものです。

インターフェイスは、クラスが従わなければならないルールを宣言するのに非常に役立ちます。契約型プログラミング テクノロジは、この機能を使用してカプセル化を強化し、ワークフローを最適化します。

以上がPHP オブジェクト指向の抽象クラス、オブジェクト インターフェイス、instanceof、およびコントラクト プログラミングのチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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