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

PHP オブジェクト指向プログラミング (oop) 学習メモ (1) - 抽象クラス、オブジェクト インターフェイス、instanceof、およびコントラクト プログラミング_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:28:261080ブラウズ

1. PHPの抽象クラス

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

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

コードをコピーします コードは次のとおりです:

抽象クラス AbstractClass
{
コード...
}

1.1、抽象メソッド

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

コードをコピーします コードは次のとおりです:

abstract public functionprototypeName($protoParam);

抽象クラスを継承する場合、サブクラスは親クラスのすべての抽象メソッドを定義する必要があります。さらに、これらのメソッドのアクセス制御は親クラスのアクセス制御と同じ (またはより緩和された) 必要があります。さらに、メソッドを呼び出すメソッドは一致している必要があります。つまり、必要なパラメータの型と数が一致している必要があります。

1.2. 抽象クラスについて

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

コードをコピーします コードは次のとおりです:

抽象クラス Car
{
抽象関数 getMaxSpeend();
}
クラス 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();
}
保護された関数 IsStreetLegal($car)
{
if ($car->getMaxSpeend() < $this -> SpeendLimit)
{
return true;
}
else
{
return false;
}
}
public function AddCar($car)
{
if($this->IsStreetLegal($car))
{
echo 「車は道路の通行が許可されました。」;
$this ->Cars[] = $car;
}
else
{
echo '車は速すぎるため、道路の通行は許可されませんでした。';
}
}
}
$Porsche911 = newロードスター();
$Porsche911->SetSpeend(340);
$FuWaiStreet = 新しいストリート(80);
$FuWaiStreet->AddCar($Porsche911);
/**
*
* @result
*
* 車が速すぎるため、道路では許可されませんでした。[0.1 秒で終了]
*
 */
?>


2 .对オブジェクトインターフェイス

インターフェイスを使用すると、これらの方法を実行する必要がある特定の種類を指定できますが、これらの方法の具体的な内容を定義する必要はありません。

インターフェースはインターフェースに関連する文字によって定義され、1 つの規格を定義するようなものですが、その中ですべての方法が定義されます。

インターフェース内で定義されているすべての方法は必ず公開されている必要があり、これがインターフェースの特性です。

インターフェイスは、このタイプの API を実装するために必要な方法を指定するために使用できるタイプの構造です。

ほとんどの開発者は、コード化および生成される文書内でそれを先頭として追加することを選択します。

2.1インターフェース实现(実装)

1 つのインターフェイスを実装するには、implements オペレーターを使用します (継承抽象クラスでは拡張子を使用する必要があります)。クラス内で定義されているすべてのメソッドを実行する必要があり、1 つのインターフェイスが失敗する可能性があります。複数のインターフェースの名前。

複数のインターフェイスを実行する場合、インターフェイス内のメソッドを重複させることはできません。

インターフェイスは、extends 演算子を使用することによっても受け入れられます。

インターフェース内で常用量を設定することもできます。

复制代価

代価如下:


抽象クラス Car
{
抽象関数 SetSpeend($speend = 0);
}
インターフェース ISpeendInfo
{
function GetMaxSpeend();
}
クラス Roadster 拡張 Car 実装 ISpeendInfo
{
公開 $ Speend;
public function SetSpeend($speend = 0)
{
$this->Speend = $speend;
}
public function getMaxSpeend()
{
return $this->Speend;
}
}
クラスStreet
{
public $Cars ;
public $SpeendLimit ;
function __construct( $speendLimit = 200)
{
$this -> SpeendLimit = $speendLimit;
$this -> Cars = array();
}
保護された関数 IsStreetLegal($car)
{
if ($car->getMaxSpeend() < $this -> SpeendLimit)
{
return true;
}
else
{
return false;
}
}
public function AddCar($car)
{
if($this->IsStreetLegal($car))
{
echo 「車は道路の通行が許可されました。」;
$this ->Cars[] = $car;
}
else
{
echo '車は速すぎるため、道路の通行は許可されませんでした。';
}
}
}

$Porsche911 = 新型ロードスター();
$Porsche911->SetSpeend(340);
$FuWaiStreet = 新しいストリート(80);
$FuWaiStreet->AddCar($Porsche911);
/**
*
* @result
*
* 車が速すぎるため、道路では許可されませんでした。[0.1 秒で終了]
*
 * /
?>

3、型运算符インスタンス

instanceof 算数は PHP5 の比演算子です。適切な 2 つのパラメータを受け取り、ブール値を返します。

PHP の量が特定のクラスに属しているかどうかを確認する例

検査オブジェクトが特定の種類のクラスに属しているかどうかを確認する例
検査オブジェクトが特定のクラスに属しているかどうかを確認する特定のインターフェースのオブジェクトの例を実現しました

复制代価代価如下:
echo $Porsche911 instanceof Car;
//結果:1

$Porsche911 インスタンスの ISpeendInfo をエコー;//結果:1


4.契約プログラミング

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

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

5.概要

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

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

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

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

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

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

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

www.bkjia.com本当http://www.bkjia.com/PHPjc/788637.html技術記事 1. PHP の抽象クラス PHP 5 は、抽象クラスと抽象メソッドをサポートします。抽象として定義されたクラスはインスタンス化できません。少なくとも 1 つのメソッドが抽象宣言されている場合は、任意のクラス...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。