PHPの多形性を理解し、運用する。
7905 ワード
多形性とは?Polymorphismは長い単語ですが、非常に簡単な概念を表しています。多形性は、オブジェクト指向プログラミングモードにおけるクラスに異なる機能があり、共通のインターフェースを共有することを記述している。多形性の利点は、どのクラスを使っているのかを知る必要がないということです。彼らは同じ方法で同じ種類のコードを使って働いています。多形性を現実世界のボタンに類比することができます。ボタンの使い方はみんな知っています。圧力をかけるだけです。ボタンは「確かにそうです」ということですが、どのような接続や文脈を使うかによって異なります。あなたの上司がボタンを押すと言ったら、あなたはすでにタスクを実行するために必要なすべての情報があります。プログラミングの世界では、多形性はアプリケーションをよりモジュール化し、拡張するために使用されます。乱れた条件文で説明されている行動とは違った授業を行います。必要に応じて選択された交換対象を作成できます。これは多形性の基本的な目標である。Interfacesインターフェースはクラスと似ています。コードは含まれていません。インターフェースは方法名とパラメータを定義することができますが、方法の内容ではありません。インターフェースを実現するあらゆる種類は、インターフェースで定義されたすべての方法を実現しなければならない。一つのクラスは複数のインターフェースを実現することができる。使用する「interface」キーステートメントの一つのインターフェース:
interface MyInterface {
// methods
}
は1つのクラスに追加され、「implements」キー(複数のインターフェースはカンマで分けることができます)を使用します。
class MyClass implements MyInterface {
// methods
}
ここで定義されるすべての方法は、インターフェースで説明されるように、どのような実装クラスにも含まれる必要がある。下記のコードの注釈を読む)
interface MyInterface {
public function doThis();
public function doThat();
public function setName($name);
}
抽象類Abstract Class抽象類はインターフェースとクラスの混合です。インタフェースのように方法を定義できます。抽象クラスから継承されるクラスは、抽象クラスで定義されたあらゆる抽象的な方法を実現しなければならない。抽象類の定義方式はクラスと同じですが、前にabstractキーワードが付加されています。
// VALID
class MyClass implements MyInterface {
protected $name;
public function doThis() {
// code that does this
}
public function doThat() {
// code that does that
}
public function setName($name) {
$this->name = $name;
}
}
// INVALID
class MyClass implements MyInterface {
// missing doThis()!
private function doThat() {
// this should be public!
}
public function setName() {
// missing the name argument!
}
}
で、「extens」というキーワードでクラスに追加されます。
abstract class MyAbstract {
// methods
}
は普通のクラスのように、一般的な方法及びあらゆる抽象的な方法(キーワード「abstract」を使用して)抽象的なクラスで定義されます。抽象的な方法の挙動はインタフェースで定義された方法のようであり、その拡張クラスを継承する中で完全な定義を実現しなければならない。
class MyClass extends MyAbstract {
// class methods
}
私たちはあなたのサイトの記事を管理するためにArticeクラスの記事があると仮定します。これは文章に関する情報を含んでいます。title,author,date,and category.このように:
abstract class MyAbstract {
public $name;
public function doThis() {
// do this
}
abstract public function doThat();
abstract public function setName($name);
}
注意:この教程での例示類は「package_」を使用しています。componentClassという名前の約束は、クラス名を仮想の名前空間に分離して命名衝突を避けるための一般的な方法です。今はXMLやJSONなど様々なフォーマットの情報を出力する方法を追加したいです。このようにするつもりかもしれません。
class poly_base_Article {
public $title;
public $author;
public $date;
public $category;
public function __construct($title, $author, $date, $category = 0) {
$this->title = $title;
$this->author = $author;
$this->date = $date;
$this->category = $category;
}
}
という解決策は醜いですが、それは信頼できるものです。少なくとも今のところです。すみません、自分は将来何がありますか?もっと多くのフォーマットを追加する必要があります。このクラスを編集し続けて、もっと多くのcaseを追加してもいいですが、今は希釈しているだけです。OOPの重要な原則は一つの種類のすべきことであり、それをうまくやるべきです。この点を考慮して、条件文は赤色の標識であるべきです。クラスはいろいろなことをしようとしていることを示しています。これは多形的な用武の地である。私たちの例では、二つのタスクが明確に提示されています。文章を管理し、データをフォーマットします。本教程では、私たちは新しいクラスにフォーマットコードを再構築します。そして、多形性を使うのがどんなに簡単かを発見します。Step 2:あなたのインターフェースを定義するDefine Your Interfaceの一番目のことはインターフェースを定義するべきです。どうやってあなたのインターフェースを定義するかを考えるのは重要なことです。それに対してはどんな変化もコードを変更する必要があります。この例では、簡単なインターフェースを使用して、一つの方法を定義します。
class poly_base_Article {
//...
public function write($type) {
$ret = '';
switch($type) {
case 'XML':
$ret = '';
$ret .= '';
$ret .= '' . $obj->author . '';
$ret .= '' . $obj->date . '';
$ret .= '' . $obj->category . '';
$ret .= '';
break;
case 'JSON':
$array = array('article' => $obj);
$ret = json_encode($array);
break;
}
return $ret;
}
}
はそのように簡単です。私たちはもう一つの共通の方法を定義しました。文章オブジェクトをパラメータとして受け入れます。Writerインターフェースを実現するクラスはいずれもこの方法があることを確保します。ヒント:あなたに渡す方法と関数のパラメータの種類を厳格に制限したいなら、タイプのヒントを使ってもいいです。私たちが既にwrite()の方法でやっているように、poly uuしか受けられません。base_Artcleオブジェクトタイプのデータです。残念なことに、現在のバージョンのPHPでは、返却タイプのヒントはサポートされていませんので、注意して値の種類に戻ります。Step 3:実現クラスCreate Your Implementationを作成してインターフェースを定義したら、その時にクラスを作って本格的に仕事をします。私たちの例では、2つのフォーマットを出力する必要があります。このように、私たちはWriter類を二つお願いします。XMLWriterとJSONWriterです。伝達されたArtcleオブジェクトからデータを抽出してフォーマットするという情報はこれらのクラスに完全に依存します。以下はXMLWriter類の一例です。
interface poly_writer_Writer {
public function write(poly_base_Article $obj);
}
はクラス定義から見られるように、implementsキーワードを使って私たちのインターフェースを実現します。write()メソッドにはXMLとしてフォーマットされた機能があります。今私たちはJSONWriter類を見にきました。
class poly_writer_XMLWriter implements poly_writer_Writer {
public function write(poly_base_Article $obj) {
$ret = '';
$ret .= '';
$ret .= '' . $obj->author . '';
$ret .= '' . $obj->date . '';
$ret .= '' . $obj->category . '';
$ret .= '';
return $ret;
}
}
現在、私たちのコードの中の特定のフォーマットはそれぞれ別の種類に含まれています。各クラスには、他のものではなく、特定のフォーマットを処理する権利があります。あなたのアプリには他の部分がありません。これらはどのようにして使えばいいのかに関心が必要です。私たちのインターフェースに感謝します。Step 4:あなたのインターフェースUse Your Implementationを使用して、私たちの新しいクラスの定義の後、Artcleクラスを温めるべきです。すべてのオリジナルメソッドのコードはすでに分離されています。私たちの新しいクラスに入りました。私たちのすべての方法が今必要なのはこれらの新しいクラスを使うことです。このように:
class poly_writer_JSONWriter implements poly_writer_Writer {
public function write(poly_base_Article $obj) {
$array = array('article' => $obj);
return json_encode($array);
}
}
WriterオブジェクトObtaining A Writerを取得すると、どこからWriterオブジェクトを獲得するべきか迷ってしまうかもしれません。Writerオブジェクトをこの方法に渡す必要があるからです。これは完全にあなたに依存します。そして、多くの戦略があります。例えば、工場の種類を使って要求データを取得してから対象を作成することができます。
class poly_base_Article {
//...
public function write(poly_writer_Writer $writer) {
return $writer->write($this);
}
}
というように、あなたの要求に応じて他の多くの戦略が利用できます。この例では、どのフォーマットが使用されるかを一つの要求変数で選択します。これはrequest要求変数に基づいてクラス名を作成し、それが存在するかどうかを検出し、新しいWriterオブジェクトを返す。もしその名前のクラスが存在しないならば、異常を投げて、クライアントコードに次に何をするかを決めさせます。Step 5:一緒にPut It All Togetherを置くと、すべてのものが所定の位置に着いています。以下は私たちのクライアントコードをどう一緒に置くかです。
class poly_base_Factory {
public static function getWriter() {
// grab request variable
$format = $_REQUEST['format'];
// construct our class name and check its existence
$class = 'poly_writer_' . $format . 'Writer';
if(class_exists($class)) {
// return a new Writer object
return new $class();
}
// otherwise we fail
throw new Exception('Unsupported format');
}
}
まず、Articeオブジェクトの一例を作成して作業に協力します。そして、工場FactoryからFactoryオブジェクトを取得しようとしますが、異常が発生したらデフォルトに戻します。最後に、Writerオブジェクトが私たちにくれたArtcleのwriteの方法を伝え、結果を出力します。結論Conclusionは本教程で多形的なプロファイルを提供し、PHPのインターフェースを説明しました。意識してほしいのですが、潜在的に多状態を使うケースだけを見せてあげます。多形は優雅な方法でOOPコードの醜い条件文を避けます。それはあなたのコンポーネントを分離させるという原則に従い、多くの設計モードの構成部分です。何か質問があれば、迷わずにコメントしてください。http://net.tutsplus.com/tutorials/php/understanding-and-applying-polymorphism-in-php/原文はhttp://ihacklog.com/?p=4703で発表されました。