著者: Zhu Xianzhong によって編集されました
要約: この記事では、ポリモーフィズムの概念とオブジェクト指向設計におけるその応用について説明します。また、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('素晴らしい記事!', '一部の読者', date('Y-m-d')); break; case 'チャールズ': $myperson->フィードバック[] = array('一部の読者', '素晴らしい編集中!'); break; case 'Alejandro' : $myperson->Feedback->Append('Awesome Javascript!'); Break; default : $myperson->AddFeedback('Yay!'); } ?> |
$name = $_SESSION['name']; $myperson = person::Getperson($name); $myperson->AddFeedback('素晴らしい記事!', 'SomeReader', date('Y-m -d')); ?> |
<?php class Person{ function AddFeedback($comment, $sender, $date){ //データベースにフィードバックを追加します } } class David extends Person{ function AddFeedback($comment, $sender, $date) { parent::AddFeedback($comment, $sender, date('Y-m-d')); } } ?> |
4. PHP 5 の遅延バインディング
私の意見では、遅延バインディングは Java と C# が非常に魅力的な理由です。これらにより、基底クラスのメソッドが "this" または $this を使用してメソッドを呼び出すことができます (これらが基底クラスに存在しない場合や、基底クラスのメソッドの呼び出しが継承クラスの別のバージョンに置き換えられる場合でも)。 PHP では次の実装が許可されると考えることができます:
<?php class Person{ function AddFeedback($messageArray) { $this->ParseFeedback($messageArray); //データベースに書き込む } } class David extends Person{ function ParseFeedback($messageArray) { // 分析を行います } } ?> |
<?php $myperson = person::Getperson($name); $myperson->AddFeedback($messageArray); ?> |