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

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() 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() 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 までご連絡ください。
golang是否有抽象类golang是否有抽象类Jan 06, 2023 pm 07:04 PM

golang没有抽象类。golang并不是面向对象(OOP)语言,没有类和继承的概念,也没有抽象类的概念;但golang中有结构体(struct)和接口(interface),可以通过struct和interface的组合来间接实现面向对象语言中的抽象类。

Java 中接口和抽象类的内部类实现Java 中接口和抽象类的内部类实现Apr 30, 2024 pm 02:03 PM

Java允许在接口和抽象类中定义内部类,为代码重用和模块化提供灵活性。接口中的内部类可实现特定功能,而抽象类中的内部类可定义通用功能,子类提供具体实现。

Java 接口与抽象类:揭示它们之间的内在联系Java 接口与抽象类:揭示它们之间的内在联系Mar 04, 2024 am 09:34 AM

接口接口在Java中定义了抽象方法和常量。接口中的方法没有实现,而是由实现该接口的类来提供。接口定义了合同,要求实现类提供指定的方法实现。声明接口:publicinterfaceExampleInterface{voiddoSomething();intgetSomething();}抽象类抽象类是一个不能被实例化的类。它包含抽象方法和非抽象方法的混合。与接口类似,抽象类中的抽象方法由子类实现。但是,抽象类还可以包含具体的方法,这些方法提供了默认实现。声明抽象类:publicabstractcl

Java 接口与抽象类:通往编程天堂之路Java 接口与抽象类:通往编程天堂之路Mar 04, 2024 am 09:13 AM

接口:无实现的契约接口在Java中定义了一组方法签名,但不提供任何具体实现。它充当一种契约,强制实现该接口的类实现其指定的方法。接口中的方法是抽象方法,没有方法体。代码示例:publicinterfaceAnimal{voideat();voidsleep();}抽象类:部分实现的蓝图抽象类是一种父类,它提供了一个部分实现,可以被它的子类继承。与接口不同,抽象类可以包含具体的实现和抽象方法。抽象方法是用abstract关键字声明的,并且必须被子类覆盖。代码示例:publicabstractcla

Java 中接口和抽象类在设计模式中的应用Java 中接口和抽象类在设计模式中的应用May 01, 2024 pm 06:33 PM

接口和抽象类在设计模式中用于解耦和可扩展性。接口定义方法签名,抽象类提供部分实现,子类必须实现未实现的方法。在策略模式中,接口用于定义算法,抽象类或具体类提供实现,允许动态切换算法。在观察者模式中,接口用于定义观察者行为,抽象类或具体类用于订阅和发布通知。在适配器模式中,接口用于适配现有类,抽象类或具体类可实现兼容接口,允许与原有代码交互。

深入探讨 Golang 函数接口与抽象类的异同深入探讨 Golang 函数接口与抽象类的异同Apr 20, 2024 am 09:21 AM

函数接口与抽象类均用于代码可重用性,但实现方式不同:函数接口通过引用函数,抽象类通过继承。函数接口不可实例化,抽象类可实例化。函数接口必须实现所有声明的方法,抽象类可只实现部分方法。

Java 中接口和抽象类的性能优化技巧Java 中接口和抽象类的性能优化技巧May 04, 2024 am 11:36 AM

优化Java中接口和抽象类性能技巧:避免接口中使用默认方法,仅在必要时使用。最小化接口定义,仅包含必要内容。实现尽可能多的抽象类方法。使用final修饰符防止子类覆盖。声明不应调用的方法为private。

PHP的抽象类和接口有什么区别PHP的抽象类和接口有什么区别Mar 10, 2021 pm 05:51 PM

区别:1、抽象类可有属性、普通方法,但接口不能有;2、抽象类内未必有抽象方法,但接口内一定会有“抽象”方法;3、语法上有不同;4、抽象类用abstract关键字在类前声明,且有class声明为类,接口是用interface来声明,但不能用class来声明;5、抽象类的抽象方法一定要用abstract来声明,而接口则不需要;6、抽象类和接口实现详细方法的方式不同。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!