ホームページ > バックエンド開発 > PHPチュートリアル > PHP 5.0 におけるポリモーフィズムの実装スキームの簡単な分析_PHP チュートリアル

PHP 5.0 におけるポリモーフィズムの実装スキームの簡単な分析_PHP チュートリアル

WBOY
リリース: 2016-07-13 10:38:20
オリジナル
730 人が閲覧しました

要約: この記事では、ポリモーフィズムの概念とオブジェクト指向設計におけるその応用について説明し、PHP でのポリモーフィズムの使用方法についても分析します。 5 ではポリモーフィズムの使用とその長所と短所を示します。

遅延バインディングのサポートは、PHP の最新リリース バージョンに実装されました。もちろん、遅延バインディング機能を使用する場合にはまだ多くの問題があります。古いバージョンの PHP を使用している場合 (サーバーは PHP を実行しています) 5.0.1) では、遅延バインディングのサポートが不足していることがわかります。したがって、この記事のコードは、お使いの PHP 5 の特定のバージョンでは動作しない可能性があることに注意してください。

1. PHP 5 とポリモーフィズム

この記事では、オブジェクト指向プログラミングの最も重要な部分の 1 つであるポリモーフィズムの設計について説明したいと思います。問題を説明するために、PHP を使用しました。 5.読み続ける前に、この記事は完全に PHP に関するものではないことを明確にしてください。この言語は過去 2 つのメジャー バージョンにわたって急速な開発で大きな進歩を遂げてきましたが、オブジェクトのサポートが C++ や Java コースのようなより成熟した言語に匹敵するまでにはまだ時間がかかります。

あなたがオブジェクト指向プログラミングの初心者である場合、ポリモーフィズムのこの部分は特別であり、一度理解すると決して忘れることはできないため、この記事はあなたには適していないかもしれません。オブジェクト プログラミングと設計について少し学びたいが、「オブジェクトはポリモーフィックである」と言われることが何を意味するのかよくわからない場合は、この記事が最適です。
この記事を最後まで読むと、ポリモーフィズムとは何か、それをオブジェクト指向設計に適用する方法がわかり、PHP も理解できるようになります。 5 オブジェクトプログラミングの長所と短所。

2.ポリモーフィズムとは何ですか?

ディクショナリー.com からのポリモーフィズムの定義は、「独立した組織内、または基本的な違いなしに同じ組織内で、異なる形式、段階、またはタイプで現れる」ということです。この定義から、ポリモーフィズムは、を記述するプログラミング方法であると考えることができます。同じオブジェクトが複数の状態またはフェーズを経て変化します。実際、その本当の意味は、実際の開発では、インターフェイスまたは基本クラスのプログラミングにのみ集中すればよく、オブジェクトが属する特定のクラス (クラス) について心配する必要がないことです。

デザインパターンに慣れていれば、たとえ予備知識だけでも、この概念は理解できるでしょう。実際、ポリモーフィズムはパターンベースの設計プログラミングにおける最大のツールである可能性があります。これにより、同様のオブジェクトを論理的な方法で編成できるため、コーディング時にオブジェクトの特定のタイプを気にする必要がなくなり、さらに、必要なインターフェイスまたは基本クラスをプログラムするだけで済みます。アプリケーションが抽象的であればあるほど、柔軟性は高まります。ポリモーフィズムは動作を抽象化する最良の方法の 1 つです。

例えば、personというクラスを考えてみましょう。 David、Charles、Alejandro というクラスを使用して person をサブクラス化できます。 Person には抽象メソッド AcceptFeedback() があり、すべてのサブクラスはこのメソッドを実装する必要があります。これは、基本 Person クラスのサブクラスを使用するコードはどれも AcceptFeedback() メソッドを呼び出すことができることを意味します。オブジェクトがデビッドであるかアレハンドロであるかを確認する必要はありません。それが人であることがわかれば十分です。その結果、コードは「最小公倍数」である Person クラスにのみ焦点を当てる必要があります。

この例の Person クラスはインターフェースとして作成することもできます。もちろん、上記のものと比較するといくつかの違いがあります。主に、インターフェイスは動作を与えず、一連のルールを決定するだけです。 Person インターフェイスでは「AddFeedback() メソッドをサポートする必要がある」必要がありますが、一方、Person クラスでは AddFeedback() メソッドのデフォルト コードを提供できます。これについての理解は、「AddFeedback() のサポートを選択しない場合は、デフォルトの実装を提供する必要があります。「インターフェイスまたは基本クラスの選択方法はこの記事の主題ではありませんが、一般に、基本クラスを通じてデフォルトのメソッドを実装する必要があります。クラスが実装する必要な機能セットの概要を簡単に説明できる場合は、インターフェイスを使用することもできます。

3. ポリモーフィックデザインの適用

引き続き Person 基本クラスの例を使用しますが、今度は非ポリモーフィック実装を分析してみましょう。次の例では、さまざまなタイプの Person オブジェクトを使用していますが、これは非常に不満足なプログラミング方法です。実際の Person クラスは省略されていることに注意してください。これまでのところ、コード呼び出しの問題のみに注目してきました。

<?php
$name = $_SESSION['name'];
$myperson = Person::GetPerson($name);
switch (get_class($myperson)){
case 'David' :
$myperson->AddFeedback('素晴らしい記事!', 'Some Reader', date('Y-m-d'));
break;
case 'Charles':
$myperson->フィードバック[] = array('Some Reader', 'Great Editing!');
break;
case 'アレハンドロ' :
$myperson->フィードバック->Append('素晴らしい Javascript!');
break;
デフォルト :
$myPerson->AddFeedback('Yay!');
}
?>
この例は、異なる動作を持つオブジェクトを示しており、switch ステートメントを使用して異なる Person クラス オブジェクトを区別し、それぞれの正しい操作を実行します。ここでのフィードバック コメントは条件によって異なることに注意してください。これは実際のアプリケーション開発には当てはまらない可能性があります。ここでは、クラスの実装に存在する違いを説明するだけです。

以下の例ではポリモーフィズムを使用しています。

<?php
$name = $_SESSION['name'];
$myperson = Person::GetPerson($name);
$myperson->AddFeedback('素晴らしい記事!', 'サムリーダー'、 date('Y-m-d'));
?>
ここには switch ステートメントがないことに注意してください、そして最も重要なことは、 Person::GetPerson() が返すオブジェクトの種類についての情報が不足していることです。もう 1 つの Person::AddFeedback() はポリモーフィック メソッドです。動作は具象クラスによって完全にカプセル化されます。ここで David、Charles、または Alejandro を使用するかどうかに関係なく、呼び出し元のコードは具象クラスが何を行うかを知る必要はなく、基本クラスのみを知る必要があることに注意してください。

私の例は完璧ではありませんが、呼び出し側コードの観点からポリモーフィズムの基本的な使用法をすでに示しています。次に、これらのクラスの内部実装を分析する必要があります。基本クラスからの派生の優れた点の 1 つは、派生クラスが親クラスの動作にアクセスできることです。これは多くの場合、デフォルトの実装ですが、より複雑な動作を作成するためにクラス継承チェーン内で発生する場合もあります。以下は、この状況の簡単なデモンストレーションです。

<?php
class person{
function AddFeedback($comment, $sender, $date){
//データベースにフィードバックを追加します
}
}
class David は person{
関数を拡張します AddFeedback($comment, $sender){
parent::AddFeedback($comment, $sender,
date('Y-m-d'));
}
}
?>
ここで、David クラスの AddFeedback メソッドの実装では、最初に Person::AddFeedback メソッドが呼び出されます。 C++、Java、または C# のメソッドのオーバーロードを模倣していることに気づくかもしれません。これは単なる単純化された例であり、作成する実際のコードは実際のプロジェクトに完全に依存することに注意してください。
4. 5 の遅延バインディング

私の意見では、遅延バインディングは、Java と C# が非常に魅力的な理由である重要な理由です。これらにより、基底クラスのメソッドが "this" または $this を使用してメソッドを呼び出すことができます (これらが基底クラスに存在しない場合や、基底クラスのメソッドの呼び出しが継承クラスの別のバージョンに置き換えられる場合でも)。 PHP では次の実装が許可されると考えることができます:

<?php
class person{
function AddFeedback($messageArray) {
$this->ParseFeedback($messageArray);
//データベースに書き込む
}
}
class David は Person{
function ParseFeedback($messageArray){
// を拡張します。 分析してみましょう
}
}
?>
パーソン クラスには ParseFeedback がないことを思い出してください。ここで、(この例のために) 実装コードのこの部分があると仮定すると、これにより $myperson が David オブジェクトになります:

<?php
$myperson = Person::GetPerson($name);
$myperson->AddFeedback($messageArray);
?>
解析エラーが発生しました!一般的なエラー メッセージは、ParseFeedback メソッドが存在しない、または同様の情報が存在しないというものです。 PHPについて これらの遅延バインディングについては 5 で説明します。次に、遅延バインディングの概念をまとめてみましょう。

遅延バインディングとは、メソッド呼び出しが最後の瞬間までターゲットオブジェクトにバインドされないことを意味します。これは、実行時にメソッドが呼び出されたときに、それらのオブジェクトがすでに具象型を持っていることを意味します。上の例では、David::AddFeedback() を呼び出しました。David::AddFeedback() の $this は David オブジェクトを参照しているため、論理的には ParseFeedback() メソッドが存在すると仮定できますが、実際には存在しません。 AddFeedback() が Person で定義されており、ParseFeedback() が Person クラスから呼び出されるために存在します。
残念ながら、PHP を排除する簡単な方法はありません 5のこの動作。これは、柔軟なポリモーフィックなクラス階層を作成したい場合には、少し無力になる可能性があることを意味します。

私が PHP を選択していることを指摘しなければなりません 5 がこの記事の表現言語として使用されているのは、単にこの言語がオブジェクト概念の完全な抽象化を実現していないからです。 PHPだから 5 はまだベータ段階にあるため、これは理解できます。さらに、抽象クラスとインターフェイスが言語に追加されたため、遅延バインディングも実装する必要があります。

5. まとめ

この時点で、ポリモーフィズムとは何か、そしてなぜ PHP なのかについての基本を理解しているはずです。 5 はポリモーフィズムの実装が完璧ではありません。一般に、多態性オブジェクト モデルを使用して条件付き動作をカプセル化する方法を理解しておく必要があります。もちろん、これによりオブジェクトの柔軟性が向上し、実装するコードが少なくなります。さらに、(オブジェクトの状態に応じて) 特定の条件を満たす動作をカプセル化することで、コードの明瞭さが向上します。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/735109.html技術記事要約: この記事では、ポリモーフィズムの概念とオブジェクト指向設計におけるその応用について説明し、PHP 5 でのポリモーフィズムの使用方法とその利点と欠点についても分析します。 PHP の最新リリース バージョンでは...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート