abstract public function doThat();パブリック関数 setName ($name)
}
Web サイト上の記事の管理を担当する Article クラスがあることを前提としています。タイトル、著者、日付、カテゴリなどの記事に関する情報が含まれています。
コードをコピーします コードは次のとおりです。著者 ; パブリック $date; パブリック関数 __construct($title, $author, $category = 0) {
$this->title = $title; = $author;
$this->date = $date;
$this->category = $category;
}
注: このチュートリアルのサンプル クラスでは、「package_component_Class」という命名規則が使用されています。は、名前の競合を避けるためにクラス名を仮想名前空間に分割するために使用される一般的な方法です。
次に、XML や JSON などのさまざまな形式で情報を出力するメソッドを追加します。次のように実行するとよいでしょう:
コードをコピー
コードは次のとおりです:
class Poly_base_Article {
//...
public function write($type) {
$ret = '' ; switch ($type) { $ret = ''; $ret .= '' . .= ' . $obj->date .= '' . $obj-> break;
$array = array('article' => $obj);
$ret = json_encode($array);
}
return $ret
}
この解決策は醜いですが、それは信頼できるものです - 少なくとも今のところ。将来、さらにフォーマットを追加する必要があるときはどうなるのか、自問してみてください。このクラスを編集し続けて、さらに多くのケースを追加することはできます
が、今はクラスを薄めている (FIX ME: 薄めている) だけです。
OOP の重要な原則は、クラスが 1 つのことを実行し、それを適切に実行する必要があるということです。
これを念頭に置くと、条件ステートメントは、クラスがさまざまなことを実行しようとしているという危険信号である必要があります。ここでポリモーフィズムが登場します。
この例では、記事の管理とそのデータのフォーマットという 2 つのタスクが明確に示されています。このチュートリアルでは、書式設定コードを新しいクラスにリファクタリングし、ポリモーフィズムの使用がいかに簡単であるかを発見します。
ステップ 2: インターフェイスを定義する
まず、インターフェイスを定義する必要があります。インターフェイスを変更すると、それを呼び出すコードも変更する必要があるため、インターフェイスを定義する方法をよく考えることが重要です。
この例では、単純なインターフェイスを使用してメソッドを定義します。
コードをコピーする
コードは次のとおりです。
それはとても簡単です。記事オブジェクトをパラメータとして受け取るパブリック メソッド write() を定義しました。 Writer インターフェースを実装するクラスには必ずこのメソッドがあります。
ヒント: メソッドや関数に渡されるパラメーターの型を厳密に制限したい場合は、 write() メソッドで既に行ったように、型ヒントを使用できます。これは、それに応じて、poly_base_Article オブジェクト型
の数のみを受け入れることができます。残念ながら、現在のバージョンの PHP では戻り値の型のヒントはサポートされていないため、戻り値の型には注意する必要があります。
ステップ 3: 実装を作成する
インターフェイスを定義したら、実際の作業を行うクラスを作成します。この場合、2 つの形式を出力する必要があります。このように、XMLWriter と JSONWriter という 2 つの Writer クラスが必要になります。渡された
Article オブジェクトからデータを抽出し、情報をフォーマットするのは完全にこれらのクラス次第です。
以下は XMLWriter クラスの例です:
コードをコピーします
コードは次のとおりです:
class Poly_writer_XMLWriterimplements Poly_writer_Writer { public function write(poly_base_Article $obj) { $ret = '' ; .= ''; $ret .= '' . $obj->date . $obj- >category . '';
$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() メソッドのすべてのコードが分離され、新しいカテゴリに入力されたことを確認します。
ここでメソッドが行う必要があるのは、次のようにこれらの新しいクラスを使用することだけです:
コードをコピー コードは次のとおりです:
class Poly_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'; ) {
// 新しい Writer オブジェクトを返します
return new $class();
}
// それ以外の場合は失敗します
throw new Exception('Unsupported format')
}
}
前述のように、他にも多くの戦略が利用可能です。この例では、リクエスト変数を使用して、使用する形式を選択します。リクエスト変数に基づいてクラス名を構築し、それが存在するかどうかを確認して、新しい Writer オブジェクトを返します。その名前のクラスが存在しない場合は、例外をスローし、クライアント コードに次に何を行うかを決定させます。
ステップ 5: すべてをまとめる
すべてが整ったら、クライアント コードは次のようにまとめられます:
コードをコピーします
コードは次のとおりです: $article = new Poly_base_Article('ポリモーフィズム', '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
http://www.bkjia.com/PHPjc/324073.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/324073.html技術記事ポリモーフィズムとは何ですか?ポリモーフィズムは長い言葉ですが、非常に単純な概念を表しています。 ポリモーフィズムは、オブジェクト指向プログラミング モデルのクラス間の違いを記述します...