ホームページ php教程 php手册 PHP におけるポリモーフィズムの理解と使用 [翻訳]

PHP におけるポリモーフィズムの理解と使用 [翻訳]

Jun 13, 2016 pm 12:06 PM
php 言葉 そして 多態性 はい 理解する 表面 使用

ポリモーフィズムとは何ですか?
ポリモーフィズムは長い単語ですが、非常に単純な概念を表しています。
ポリモーフィズムは、クラスが共通のインターフェースを共有しながら異なる機能を持つオブジェクト指向プログラミング モデルを表します。
ポリモーフィズムの利点は、異なるクラスのコードでもすべて同じように動作するため、どのクラスが使用されているかを知る必要がないことです。
ポリモーフィズムは、現実世界のボタンにたとえることができます。ボタンの使い方は誰もが知っています。ボタンを押すだけです。ただし、ボタンが「実際に何であるか」は、ボタンが何に接続されているか、およびボタンが使用されるコンテキストによって異なりますが、その結果はボタンの使用方法には影響しません。上司がボタンを押すように指示した場合、あなたはそのタスクを実行するために必要な情報をすべてすでに持っています。
プログラミングの世界では、アプリケーションをよりモジュール化して拡張可能にするためにポリモーフィズムが使用されます。さまざまなクラスでアクションを記述する煩雑な条件文を作成するのではなく、ニーズに基づいて選択された交換可能なオブジェクトを作成できます。これがポリモーフィズムの基本的な目標です。
インターフェイス
インターフェイスは、コードを含めることができないことを除けば、クラスに似ています。インターフェイスではメソッド名とパラメータを定義できますが、メソッドの内容は定義できません。インターフェイスを実装するクラスは、そのインターフェイスで定義されているすべてのメソッドを実装する必要があります。クラスは複数のインターフェイスを実装できます。
「interface」キーワードを使用してインターフェイスを宣言します。

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


インターフェース MyInterface {
// メソッド
}


は、「implements」キーワードを使用してクラスにアタッチされます (複数のインターフェースはカンマで区切ることができます):

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


class MyClassimplements MyInterface {
//methods
}

メソッドは、メソッド本体 (中括弧で囲まれた部分) がないことを除いて、クラスと同じようにクラスで定義できます。

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

interface MyInterface {
public function doThis(); public function doThat ();
public function setName($name);
}


ここで定義されたすべてのメソッドは、それを実装するクラスのインターフェイスに記述されているように含める必要があります。 (以下のコード コメントを読んでください)



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

//Legal VALID

class MyClass は MyInterface {
protected $name;
public function doThis() {
// これを行うコード
}
public function doThat() {
// これを行うコードthat
}
public function setName($name) {
$this->name = $name;
}
}
// MyClass が実装するクラスが無効ですMyInterface {
// doThis() がありません!
プライベート関数 doThat() {
// これはパブリックである必要があります!
}
パブリック関数 setName() {
// がありませんname 引数!
}
}


抽象クラス 抽象クラス
抽象クラスはインターフェイスとクラスの混合物です。インターフェースと同じようにメソッドを定義できます。抽象クラスを継承するクラスは、抽象クラスで定義されているすべての抽象メソッドを実装する必要があります。

抽象クラスはクラスと同じ方法で定義されますが、先頭に抽象キーワードが追加されます。



コードをコピー

コードは次のとおりです: 抽象クラス MyAbstract {

// メソッド

}


は、「extends」キーワードを使用してクラスにアタッチされます:



コードをコピーします

コードは次のとおりです: class MyClass extends MyAbstract {

// クラス メソッド

}


通常のクラスと同様に、通常のメソッドと抽象メソッド (キーワードを使用) 「abstract」)をクラス内で定義したabstractに追加することができます。抽象メソッドはインターフェイスで定義されたメソッドと同様に動作し、それを継承する拡張クラスはまったく同じ定義を実装する必要があります。



コードをコピーします

コードは次のとおりです。 abstract class MyAbstract {

public $name

public; function doThis( ) {
// これを実行します
}
abstract public function doThat();
abstract public function setName($name);


Web サイト上の記事を管理する Article クラスがあると仮定します。タイトル、著者、日付、カテゴリなどの記事に関する情報が含まれています。
次のようになります。



コードをコピーします

コードは次のとおりです。


classpoly_base_Article {
public $title;
public $author;
public $category;
public function __construct($title, $author, $date, $category = 0) {
$this->title = $title;
$this->author = $author;
$this->date = $date; >$this->category = $category;
}
}


注: このチュートリアルのサンプル クラスでは、一般的な「package_component_Class」という命名規則が使用されています。名前の競合を避けるためにクラス名を仮想名前空間に分割する方法。

次に、XML や JSON などのさまざまな形式で情報を出力するメソッドを追加します。次のようなことを行うとよいでしょう:


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

class Poly_base_Article {

//..
パブリック関数 write($type) {
$ret = '';
switch($type) {
case 'XML':
$ret = ' ';
$ret .= '';
$ret .= '' . $obj->date ';
$ret .= '' . $obj-> '';
case ':
$array = array(' 記事' => $obj);
$ret = json_encode($array);
}
return
}
}


このソリューションは醜いですが、少なくとも現時点では信頼できます。将来、さらにフォーマットを追加する必要があるときはどうなるのか、自問してみてください。このクラスを編集し続けて、ケースをどんどん追加することもできます
が、今はクラスを薄めている (FIX ME: 薄めている) だけです。
OOP の重要な原則は、クラスが 1 つのことを実行し、それを適切に実行する必要があるということです。
これを念頭に置くと、条件ステートメントは、クラスがさまざまなことを実行しようとしているという危険信号であるはずです。ここでポリモーフィズムが登場します。
この例では、記事の管理とそのデータのフォーマットという 2 つのタスクが明確に示されています。このチュートリアルでは、書式設定コードを新しいクラスにリファクタリングし、ポリモーフィズムの使用がいかに簡単であるかを発見します。

ステップ 2: インターフェイスを定義する
最初にインターフェイスを定義する必要があります。インターフェイスを変更すると、呼び出すコードも変更する必要があるため、インターフェイスを定義する方法を理解することが重要です。それ。
この例では、単純なインターフェイスを使用してメソッドを定義します:



コードをコピーします

コードは次のとおりです:

interface Poly_writer_Writer { public function write(poly_base_Article $obj); }

非常に簡単で、Article オブジェクトを受け入れる public メソッド write() を定義しました。パラメータとして。 Writer インターフェースを実装するクラスには必ずこのメソッドがあります。
ヒント: メソッドや関数に渡されるパラメーターの型を厳密に制限したい場合は、write() メソッドで行ったように、poly_base_Article オブジェクト型のみを受け入れることができる型ヒントを使用できます。 Data
Data 。残念ながら、現在のバージョンの PHP では戻り値の型のヒントはサポートされていないため、戻り値の型には注意する必要があります。
ステップ 3: 実装を作成する
インターフェイスを定義したら、実際の作業を行うクラスを作成します。この場合、2 つの形式を出力する必要があります。このように、XMLWriter と JSONWriter という 2 つの Writer クラスが必要になります。渡された

Article オブジェクトからデータを抽出し、情報をフォーマットするのは完全にこれらのクラス次第です。
次に、XMLWriter クラスの例を示します。



コードをコピーします。

コードは次のとおりです。

class Poly_writer_XMLWriter Poly_writer_Writer { public function write(poly_base_Article $obj) { $ret = ''; $ret .= ''; . '';

$ret .= '' .

$ret .= ''; = '';
return $ret;
}
}


クラス定義からわかるように、インターフェースを実装するには、implements キーワードを使用します。 write() メソッドには、XML にフォーマットするための関数が含まれています。
次に、JSONWriter クラスを見てみましょう。



コードをコピー

コードは次のとおりです。


class Poly_writer_JSONWriter は、poly_writer_Writer を実装します。 {

public function write(poly_base_Article $obj) { $array = array('article' => $obj); return json_encode($array); }


各形式に固有のコードは別のクラスに含まれています。各クラスは、他の形式ではなく、特定の形式を処理する単独の責任を負います。私たちのインターフェースのおかげで、アプリケーションの他の部分は、
を使用するためにこれがどのように機能するかを気にする必要はありません。
ステップ 4: 実装を使用する
新しいクラスが定義されたら、元の write() メソッドのすべてのコードが分離され、新しいカテゴリに入ります。
メソッドが今行う必要があるのは、次のようにこれらの新しいクラスを使用することだけです:

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


classpoly_base_Article {
//...
public function write(poly_writer_Writer $writer) {
return $writer->write($this)
}
}


Writer の取得
このメソッドには Writer オブジェクトを渡す必要があるため、どこから Writer オブジェクトを取得すればよいか疑問に思うかもしれません。
すべてはあなた次第で、戦略はたくさんあります。たとえば、ファクトリ クラスを使用してリクエスト データを取得し、オブジェクトを作成できます。

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


class Poly_base_Factory {
public static function getWriter() {
// リクエスト変数を取得
$format = $_REQUEST['format']
// クラス名を構築します。
$class = 'poly_writer_' . 'Writer';
if(class_exists($class)) {
// 新しい Writer オブジェクトを返します
return new $class ();
}
// それ以外の場合は失敗します
throw new Exception('Unsupported format')
}
}


前述のように、ニーズに応じて、他にも多くの戦略が利用可能です。この例では、リクエスト変数を使用して、使用する形式を選択します。リクエスト変数に基づいてクラス名を構築し、それが存在するかどうかを確認して
、新しい Writer オブジェクトを返します。その名前のクラスが存在しない場合は、例外をスローし、クライアント コードに次に何を行うかを決定させます。
ステップ 5: すべてをまとめる
すべてが整ったら、クライアント コードがどのようにまとめられるかを示します:

コードをコピーコードは次のとおりです。


$article = new Poly_base_Article('Polymorphism', 'Steve', time(), 0);
try {
$writer = Poly_base_Factory::getWriter ();
}
catch (Exception $e) {
$writer = new Poly_writer_XMLWriter();
echo $article->write($writer );

まず、操作するサンプル Article オブジェクトを作成します。次に、Factory から Factory オブジェクトを取得し、例外が発生した場合はデフォルト (XMLWriter) にロールバックしようとします。

最後に、Writer オブジェクトを Article の write() メソッドに渡し、結果を出力します。

結論

このチュートリアルでは、ポリモーフィズムの概要を提供し、PHP のインターフェイスについて説明します。私が示しているのはポリモーフィズムの潜在的な使用例を 1 つだけ示していることを理解していただければ幸いです。
ポリモーフィズムは、OOP コード内の醜い条件文を回避するエレガントな方法です。これはコンポーネントを分離するという原則に従っており、多くの設計パターンに不可欠な部分です。ご質問がございましたら、お気軽にコメント欄にご質問ください。
翻訳元: http://net.tutsplus.com/tutorials/php/ Understanding-and-applying-polymorphism-in-php/
原文公開場所: http://ihacklog.com/?p = 4703

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

ホット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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles