PHP5 は新しいバージョンとして遅延バインディングのサポートを実装していますが、実際のアプリケーションでは、たとえば、古いバージョンの PHP を使用している場合、次のような問題が発生する可能性があります。遅延バインディングのサポートがありません。今日私たちが話しているのは 1 についてです。PHP 5 とポリモーフィズム
この記事では、オブジェクト指向プログラミングの最も重要な部分の 1 つであるポリモーフィズムの設計について説明したいと思います。問題を説明するために、私は PHP 5 を使用しています。読み続ける前に、この記事は完全に PHP に関するものではないことを明確にしてください。この言語は過去 2 つのメジャー バージョンにわたって急速な開発で大きな進歩を遂げてきましたが、オブジェクトのサポートが C++ や Java コースのようなより成熟した言語に匹敵するまでにはまだ時間がかかります。
あなたがオブジェクト指向プログラミングの初心者である場合、この記事はあなたには適していないかもしれません。なぜなら、PHP5 ポリモーフィズムのこの部分は特別であり、一度理解すると決して忘れることはできないからです。オブジェクト プログラミングと設計について少し学びたいが、「オブジェクトはポリモーフィックである」と言われることが何を意味するのかよくわからない場合は、この記事が最適です。
この記事を読み終えるまでに、ポリモーフィズムとは何か、それをオブジェクト指向設計に適用する方法を理解し、PHP 5 でのオブジェクト プログラミングの長所と短所を理解できるようになります。
2. ポリモーフィズムとは何ですか?
Dictionary.com からのポリモーフィズムの定義は、「根本的な違いが存在せずに、独立した組織または同じ組織内で異なる形式、段階、またはタイプで現れること」と考えられます。複数の状態またはフェーズを通じて同じオブジェクトを記述するプログラミング方法としてのポリモーフィズム。実際、その本当の意味は、実際の開発では、インターフェイスまたは基本クラスのプログラミングにのみ集中する必要があり、オブジェクトが属する特定のクラス (クラス) について心配する必要がないことです。
デザインパターンに精通していれば、たとえ予備的な理解だけでも、この概念を理解できるでしょう。実際、PHP5 ポリモーフィズムは、パターンベースの設計プログラミングにおける最大のツールである可能性があります。これにより、同様のオブジェクトを論理的な方法で編成できるため、コーディング時にオブジェクトの特定のタイプを気にする必要がなくなり、さらに、必要なインターフェイスまたは基本クラスをプログラムするだけで済みます。アプリケーションが抽象的であればあるほど、柔軟性は高まります。ポリモーフィズムは動作を抽象化する最良の方法の 1 つです。
たとえば、「person」というクラスについて考えてみましょう。 David、Charles、Alejandro というクラスを使用して person をサブクラス化できます。 Person には抽象メソッド AcceptFeedback() があり、すべてのサブクラスはこのメソッドを実装する必要があります。これは、基本 Person クラスのサブクラスを使用するコードはどれも AcceptFeedback() メソッドを呼び出すことができることを意味します。オブジェクトがデビッドであるかアレハンドロであるかを確認する必要はありません。それが人であることがわかれば十分です。その結果、コードは「最小公倍数」である Person クラスにのみ焦点を当てる必要があります。
この例の Person クラスはインターフェースとして作成することもできます。もちろん、上記のものと比較するといくつかの違いがあります。主に、インターフェイスは動作を与えず、一連のルールを決定するだけです。 Person インターフェイスでは「AddFeedback() メソッドをサポートする必要がある」必要がありますが、一方、Person クラスでは AddFeedback() メソッドのデフォルト コードを提供できます。これについての理解は、「AddFeedback() のサポートを選択しない場合は、デフォルトの実装を提供する必要があります。「インターフェイスまたは基本クラスの選択方法については、この記事の主題ではありませんが、一般に、基本クラスを通じてデフォルト メソッドを実装する必要があります。クラスが実装する必要な機能セットの概要を簡単に説明できる場合は、インターフェイスを使用することもできます。
3. PHP5 ポリモーフィズム設計の適用
引き続き Person 基本クラスの例を使用し、非ポリモーフィック実装を分析してみましょう。次の例では、さまざまなタイプの Person オブジェクトを使用していますが、これは非常に不満足なプログラミング方法です。実際の Person クラスは省略されていることに注意してください。これまでのところ、コード呼び出しの問題のみに注目してきました。
<ol class="dp-xml"> <li class="alt"><span><span><?php </span></span></li> <li class=""> <span> $</span><span class="attribute"><font color="#ff0000">name</font></span><span> = $_SESSION['name']; </span> </li> <li class="alt"> <span> $</span><span class="attribute"><font color="#ff0000">myPerson</font></span><span> = Person::GetPerson($name); </span> </li> <li class=""><span> switch (get_class($myPerson)){ </span></li> <li class="alt"><span>case 'David' : </span></li> <li class=""><span> $myPerson->AddFeedback('Great Article!','Some Reader', date('Y-m-d')); </span></li> <li class="alt"><span> break; </span></li> <li class=""><span>case 'Charles': </span></li> <li class="alt"><span> $myPerson->feedback[] = array('Some Reader', 'Great Editing!'); </span></li> <li class=""><span> break; </span></li> <li class="alt"><span>case 'Alejandro' : </span></li> <li class=""><span> $myPerson->Feedback->Append('Awesome JavaScript!'); </span></li> <li class="alt"><span> break; </span></li> <li class=""><span>default : </span></li> <li class="alt"><span> $myPerson->AddFeedback('Yay!'); </span></li> <li class=""><span> } </span></li> <li class="alt"><span>?> </span></li> </ol>
この例は、さまざまな動作を持つオブジェクトを示しており、switch ステートメントを使用してさまざまな Person クラス オブジェクトを区別し、それぞれの正しい操作を実行します。ここでのフィードバック コメントは条件によって異なることに注意してください。これは実際のアプリケーション開発には当てはまらない可能性があります。ここでは、クラスの実装に存在する違いを説明するだけです。
以下の例では、PHP5 ポリモーフィズムを使用しています。
<ol class="dp-xml"> <li class="alt"><span><span><?php </span></span></li> <li class=""> <span> $</span><span class="attribute"><font color="#ff0000">name</font></span><span> = $_SESSION['name']; </span> </li> <li class="alt"> <span> $</span><span class="attribute"><font color="#ff0000">myPerson</font></span><span> = Person::GetPerson($name); </span> </li> <li class=""><span> $myPerson->AddFeedback('Great Article!', 'SomeReader', date('Y-m-d')); </span></li> <li class="alt"><span>?> </span></li> </ol>
ここには switch ステートメントがないことに注意してください。そして最も重要なことは、Person::GetPerson() が返すオブジェクトの種類についての情報が欠如していることです。もう 1 つの Person::AddFeedback() はポリモーフィック メソッドです。動作は具象クラスによって完全にカプセル化されます。ここで David、Charles、または Alejandro を使用するかどうかに関係なく、呼び出し元のコードは具象クラスの動作を知る必要はなく、基本クラスのみを知る必要があることに注意してください。
尽管我的示例并不完美,但是,从调用代码的角度,它已经展示了PHP5多态性的基本用法。现在我们需要分析这些类的内部实现。从一个基类进行派生的一个最伟大的地方在于,该派生类能够存取父类的行为,这种情况常常是缺省的实现,但是也可能出现在类继承链中用于创建更为复杂的行为。下面是这种情况的一个简单展示。
<ol class="dp-xml"> <li class="alt"><span><span><?php </span></span></li> <li class=""><span>class Person{ </span></li> <li class="alt"><span> function AddFeedback($comment, $sender, $date){ </span></li> <li class=""><span>//把回馈添加到数据库 </span></li> <li class="alt"><span> } </span></li> <li class=""><span>} </span></li> <li class="alt"><span>class David extends Person{ </span></li> <li class=""><span> function AddFeedback($comment, $sender){ </span></li> <li class="alt"><span>parent::AddFeedback($comment, $sender, </span></li> <li class=""><span>date('Y-m-d')); </span></li> <li class="alt"><span> } </span></li> <li class=""><span>} </span></li> <li class="alt"><span>?> </span></li> </ol>
在此,David类中的AddFeedback方法实现中首先调用了Person::AddFeedback方法。你可能注意到,它模仿了C++,Java或C#中的方法重载。请记住,这仅是一个简单化的示例,并且你编写的PHP5多态性实际代码完全依赖于你的实际工程。